如何在perl中使用XML :: Simple从XML中删除节点

时间:2015-07-23 14:12:58

标签: xml perl

我需要使用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的新手。

3 个答案:

答案 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

更新2

要指定要作为变量删除的版本号,可以将字符串的值插入到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{"" },    
)