我需要使用XML :: Simple
从xml中删除一个节点我的XML看起来像:
<Install>
<version >
<number>6.0</number>
<build>1014445</build>
<path>path</path>
<kind>native</kind>
</version>
<version >
<number>6.1</number>
<build>1025654</build>
<path>path</path>
<kind>native</kind>
</version>
</Install>
我需要在版本下删除与特定号码匹配的节点,就像我需要删除number = 6.0的节点一样。 更新的XML将如下所示: -
<Install>
<version >
<number>6.1</number>
<build>1025654</build>
<path>path</path>
<kind>native</kind>
</version>
</Install>
请原谅我,如果这个问题重复,我是perl的新手。
答案 0 :(得分:6)
这是使用XML::Twig
的解决方案。正如我在评论中所说,XML::Simple
模块不是一个好的选择,除非你 没有选择
XML::Twig
使用XPath的子集,因此用于查找所需version
元素的表达式与XML::LibXML
解决方案中的元素不同
use strict;
use warnings;
use XML::Twig;
my $twig = XML::Twig->new;
$twig->parsefile('install.xml');
for my $number ( $twig->findnodes('/Install/version/number[string()="6.0"]') ) {
$number->parent->delete;
}
$twig->set_pretty_print('indented_c');
$twig->print;
<Install>
<version>
<number>6.1</number>
<build>1025654</build>
<path>path</path>
<kind>native</kind>
</version>
</Install>
如果要使程序直接写入新的XML文件而不是使用命令行重定向输出,那么您只需要open
新文件并将文件句柄传递给{{ 1}}方法调用
喜欢这个
print
要指定要作为变量删除的版本号,可以将字符串的值插入到XPath表达式中
open my $xml_fh, '>', 'install_new.xml' or die $!;
$twig->set_pretty_print('indented_c');
$twig->print($xml_fh);
但最好迭代所有my $filter = '6.0';
for my $number ( $twig->findnodes(qq{/Install/version/number[string()="$filter"]} } {
...
}
元素并编写显式比较,如下所示
number
答案 1 :(得分:3)
几乎不可能让XML :: Simple生成它所读取的相同输出。由于这个原因和其他原因,模块的文档说明
不鼓励在新代码中使用此模块
我使用XML :: LibXML。
for my $node ($doc->findnodes('/Install/version[number/text()="6.0"]')) {
$node->unbindNode();
}
答案 2 :(得分:2)
我喜欢XML :: DT(我是它的作者)......
#!/usr/bin/perl
use XML::DT;
use strict;
my $filename = shift;
print pathdt($filename,
'number' => sub{father(del => 1) if($c eq "6.1"); toxml; },
'version[@del]' => sub{"" },
)