2

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

示例 XML(文件名.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;

现在它在终端中输出预期的结果,但不保存文件。
预期结果(文件名.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,所以欢迎任何帮助,谢谢。

4

2 回答 2

5

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

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

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

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

编辑:还要引用文档(这就是我所做的),您可以将格式参数传递给这些函数。

如果 $format 为 0,则文档按照最初的解析方式转储

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

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

给你:

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

或者

print {$out_fh} $xmldoc->toString($format);
于 2013-03-05T03:37:55.043 回答
1

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

xml_grep2 -v '/twice/inner/twice[surname = "Bowler"]' input.xml > output_xml
于 2013-03-05T08:25:34.827 回答