2010-11-29 3 views
1

Этот поток является продолжением Perl script to populate an XML file.Изменение содержимого файла XML через Perl-скрипт

Файл Я хочу изменить это:

<?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». Я не могу сопоставить правильный тег.

+0

И ваша проблема? – cjm 2010-11-29 07:27:22

+0

push @ {$ doc -> {configuration} -> {'country-list'} -> {country}}, $ platform_name; - было предложено, но я не уверен, как именно я должен использовать push для добавления новой страны. – hari 2010-11-29 07:28:52

ответ

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

Вы не можете использовать push. Push - это добавление элемента в массив (список). Судя по команде «толчок», которую кто-то дал вам раньше, страны представлены как хэш, а не список, поэтому вам нужно что-то вроде

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

Это создает пустой хэш для «Трансильвании». Ваша система может потребовать наличия там некоторой структуры.

+0

Спасибо большое Колин. – hari 2010-11-29 18:59:56

Смежные вопросы