我有一个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,所以请欢迎任何帮助,谢谢。
答案 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