通过Perl脚本更改XML文件内容

时间:2010-11-29 06:42:40

标签: xml perl xml-simple xml-twig

此主题是 Perl script to populate an XML file 的继续。

我想要更改的文件是:

<?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>

我想在此列表中添加一个新国家/地区。

在上一个问题中, 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';

建议添加一个新标签,但在我的情况下,我不确定如何使用“push”。我无法映射到正确的标签。

2 个答案:

答案 0 :(得分:1)

我觉得XML::DOM更容易使用。它可能有点冗长,但你可以很容易地理解它在做什么。

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");

答案 1 :(得分:0)

你不能使用推送。 Push用于将项目附加到数组(列表)。从某人之前给你的“推”命令判断,国家被表示为哈希,而不是列表,所以你需要像

这样的东西

$ doc-&gt; {countries) - &gt; {country} - &gt; {Transylvania} = {};

那就是为'特兰西瓦尼亚'创建一个空哈希。您的系统可能需要在那里有一些结构。