2013-03-05 128 views
2

我有一個XML文件,我想讀取它 - 刪除節點 - 保存它。 我請從終端(perl的script.pl)perl - 從xml文件中刪除節點

例如XML(filename.xml中)的Perl:

<?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 2013-03-05 03:22:34

+0

確切地說,它不保存文件 – dimmageiras 2013-03-05 03:29:58

回答

5

使用的toString文檔說做這樣的:

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

您還可以使用toFile()功能來保存它:

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

編輯:也引述文檔,(這就是我所做的),您可以將format參數傳遞給這些函數。

如果$格式爲0,比原稿的傾倒,因爲它本來 解析

如果$格式是1,libxml2的將新增可忽略空格,所以節點 內容更容易閱讀。現有文本節點不會被更改

如果$ format爲2(或更高),則libxml2將充當$ format == 1,但它將爲每個文本節點添加前導和尾隨換行符。

給你:

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

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

謝謝Nate,這正是我需要的! – dimmageiras 2013-03-05 03:47:14

1

你也可以使用App::Xml_grep2在命令行裏這麼做:

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

不錯的建議,但我沒有提到我是從iPhone做到這一點的 – dimmageiras 2013-03-05 17:44:10