perl - 从xml文件中删除节点

dim*_*ras 2 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>
Run Code Online (Sandbox Code Playgroud)

示例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;
Run Code Online (Sandbox Code Playgroud)

现在它在终端输出预期结果,但不保存文件.
预期结果(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>
Run Code Online (Sandbox Code Playgroud)

我搜索了好几个小时,找不到任何东西,对不起,如果它是重复的!
这是我第一次体验perl,所以请欢迎任何帮助,谢谢.

Nat*_*ate 5

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

open my $out_fh, '>', 'somefile.xml';
print {$out_fh} $xmldoc->toString;
Run Code Online (Sandbox Code Playgroud)

您也可以使用该toFile()功能保存它:

$xmldoc->toFile("someFile.xml");
Run Code Online (Sandbox Code Playgroud)

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

如果$ format为0,则文件将被转储,因为它最初被解析

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

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

给你:

$xmldoc->toFile("someFile.xml", $format);
Run Code Online (Sandbox Code Playgroud)

要么

print {$out_fh} $xmldoc->toString($format);
Run Code Online (Sandbox Code Playgroud)