2013-03-05 4 views
2

У меня есть XML-файл, и я хочу его прочитать - удалить узел - сохранить его. я бегу Perl из терминала (Perl script.pl)perl - удалить узел из xml-файла

пример XML (filename.xml):

<?xml version="1.0" encoding="UTF-8"?> 
<twice> 
    <inner> 
     <twice> 
      <name>John</name> 
      <surname>Smith</surname> 
     </twice> 
     <twice> 
      <name>Alan</name> 
      <surname>Bowler</surname> 
     </twice> 
     <twice> 
      <name>Michael</name> 
      <surname>Deck</surname> 
     </twice> 
    </inner> 
</twice> 

пример сценария Perl (script.pl):

use strict; 
use warnings; 
use XML::LibXML; 
my $filename = "filename.xml"; 
my $parser = XML::LibXML->new(); 
my $xmldoc = $parser->parse_file($filename); 
for my $dead ($xmldoc->findnodes(q{/twice/inner/twice[surname = "Bowler"]})) { 
    $dead->unbindNode; 
} 
print $xmldoc->toString; 

Теперь выводит ожидаемый результат в терминале, но без сохранения файла.
Ожидаемый результат (filename.xml):

<?xml version="1.0" encoding="UTF-8"?> 
<twice> 
    <inner> 
     <twice> 
      <name>John</name> 
      <surname>Smith</surname> 
     </twice> 
     <twice> 
      <name>Michael</name> 
      <surname>Deck</surname> 
     </twice> 
    </inner> 
</twice> 

Я искал в течение многих часов и не смогли найти ничего, жаль, если это дубликат!
Это мой первый опыт работы с perl, поэтому, пожалуйста, любая помощь будет приветствоваться, спасибо.

+0

То есть нечетное, она удалена Боулер записывает для меня. Или вы имеете в виду, что он отлично печатает на терминале, но не сохраняет файл filename.xml? – Nate

+0

точно, он не сохраняет файл – dimmageiras

ответ

5

При использовании ToString документы говорят, чтобы сделать это следующим образом:

open my $out_fh, '>', 'somefile.xml'; 
print {$out_fh} $xmldoc->toString; 

Вы также можете использовать функцию toFile(), чтобы сохранить его:

$xmldoc->toFile("someFile.xml"); 

Edit: Также цитировать документы, (это все, что я сделал), вы можете передать параметр формата этим функциям.

Если $ формат 0, чем документ сваливается, как это было первоначально разобраны

Если формат $ 1, libxml2 добавит игнорируемые пробелы, поэтому содержание узлов легче читать. Существующие текстовые узлы не будут изменены

Если $ format равен 2 (или выше), libxml2 будет действовать как $ format == 1, но он добавляет перерыв ведущей и завершающей строки на каждый текстовый узел.

Давать вам:

$xmldoc->toFile("someFile.xml", $format); 

или

print {$out_fh} $xmldoc->toString($format); 
+0

Спасибо, Нейт, это именно то, что мне нужно! – dimmageiras

1

Вы также можете использовать App::Xml_grep2 сделать это из командной строки:

xml_grep2 -v '/twice/inner/twice[surname = "Bowler"]' input.xml > output_xml 
+0

Хорошее предложение, но я не упоминал, что я делаю это с iPhone – dimmageiras