perl - 从xml文件中删除节点

时间:2013-03-05 02:52:12

标签: xml perl xml-parsing xml-libxml

我有一个XML文件,我想读它 - 删除一个节点 - 保存它。 我从终端运行perl(perl script.pl)

示例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,所以请欢迎任何帮助,谢谢。

2 个答案:

答案 0 :(得分:5)

当使用toString时,文档说这样做:

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

您还可以使用toFile()功能进行保存:

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

编辑:同样引用文档,(这就是我所做的)你可以将format参数传递给这些函数。

  

如果$ format为0,则文档将按原来转储   解析

     

如果$ format为1,libxml2将添加可忽略的空格,因此节点   内容更容易阅读。现有文本节点不会被更改

     

如果$ format是2(或更高),libxml2将作为$ format == 1但它   为每个文本节点添加前导和尾随换行符。

给你:

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

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

答案 1 :(得分:1)

您还可以使用App::Xml_grep2从命令行执行此操作:

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