2

This thread is in continuation of Perl script to populate an XML file.

The file I want to change is:

<?xml version="1.0" encoding="UTF-8"?>
  <configuration start="earth">
    <country-list>
      <country name="japan">
        <description></description>
        <start>1900</start>
        <end/>
      </country>
      <country name="italy">
        <description></description>
        <start>1950</start>
        <end/>
      </country>
      <country name="korea">
        <description></description>
        <start>1800</start>
        <end/>
      </country>
    </country-list>
  </configuration>

I want to add a new country here in this list.

In previous question, Perl script to populate an XML file.

#Get the list of cities as a list, then push "Tokyo" to it.
push @{$doc->{countries}->{country}->{'japan-'}->{city}}, 'Tokyo';

This was suggested to add a new tag, but in my case not sure how exactly can I use "push". I am not able to map to the correct tag.

1
  • push @{$doc->{configuration}->{'country-list'}->{country}}, $platform_name ; -- was suggested but I am not sure, how exactly should I use push to add a new country. Commented Nov 29, 2010 at 7:28

2 Answers 2

2

I find XML::DOM a lot simpler to use. It may be a bit verbose, but you can easily understand what it is doing.

use XML::DOM;

#parse the file
my $parser = new XML::DOM::Parser;
my $doc = $parser->parsefile ("test.xml");
my $root = $doc->getDocumentElement();

#get the country-list element
my $countryListElement = pop(@{$root->getElementsByTagName('country-list')}); 

#create a new country element
my $newCountryElement= $doc->createElement('country');
$newCountryElement->setAttribute("name","England");

my $descElement= $doc->createElement('description');
$newCountryElement->appendChild($descElement);

my $startElement= $doc->createElement('start');
my $startTextNode= $doc->createTextNode('1900');
$startElement->appendChild($startTextNode);
$newCountryElement->appendChild($startElement);

my $endElement= $doc->createElement('end');
$newCountryElement->appendChild($endElement);

#add the country to the country-list
$countryListElement->appendChild($newCountryElement);

#print it out
print $doc->toString;

#print to file
$doc->printToFile("out.xml");
Sign up to request clarification or add additional context in comments.

2 Comments

Wow, works great and easy to understand :) - thanks much. Only issue I have is, when I add a node, the o/p looks kinda weird, the indentation and spacing is awkward. Any solution to that?
Aah, that was the "\n" chars being added with my user input field. "chomp" did the trick. Thanks Dogbane.
0

You can't use push. Push is for appending an item to an array (a list). Judging by the "push" command somebody gave you before, countries are represented as a hash, not a list, so you need something like

$doc->{countries)->{country}->{Transylvania} = {};

That is creating an empty hash for 'Transylvania'. Your system may require there to be some structure in there.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.