我正在尝试使用XML :: TWig删除节点我的代码如下; -
my $cfg = shift;
my $version = '6.0';
my $twig = XML::Twig->new;
my $file_loc = catfile( home_directory_path(), "Builds","data.xml" );
$twig->parsefile("$file_loc");
for my $number ( $twig->findnodes('/Install/version/number') ) {
$number->parent->delete if $number->trimmed_text eq $version;
}
open my $xml_fh, '>', "$file_loc" or die $!;
$twig->set_pretty_print('indented_c');
$twig->print($xml_fh);
close $xml_fh;
我的xml是这样的。
<Install>
<version>
<number>7.0</number>
<build>build</build>
<path>path</path>
<kind>kind</kind>
</version>
<version>
<number>6.0</number>
<build>build</build>
<path>path</path>
<kind>kind</kind>
</version>
</Install>
如果数字匹配,我试图删除版本节点。
当xml只有一个节点时,工作正常: -
<Install>
<number>6.0</number>
<build>build</build>
<path>path</path>
<kind>kind</kind>
</version>
</Install>
在这种情况下,它将从版本节点删除6.0,但如果第一种情况下有多于1个版本节点,则它不会删除它。
第一种情况下的预期输出是。
<Install>
<version>
<number>7.0</number>
<build>build</build>
<path>path</path>
<kind>kind</kind>
</version>
</Install>
它正在发出错误&#34;恐慌:尝试将释放的标量491b4d8复制到2c52da0&#34;。它解析第一个节点7.0并返回上述错误如果我交换节点的位置就会发生同样的事情。
答案 0 :(得分:1)
我的测试用例:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
my $version = '6.0';
my $twig = XML::Twig->new( pretty_print => 'indented_a' )->parse( \*DATA );
for my $number ( $twig->findnodes('/Install/version/number') ) {
$number->parent->delete if $number->trimmed_text eq $version;
}
$twig->print;
__DATA__
<Install>
<version>
<number>7.0</number>
<build>1032474</build>
<path>path</path>
<kind>RIBS</kind>
</version>
<version>
<number>6.0</number>
<build>1025654</build>
<path>path</path>
<kind>RIBS</kind>
</version>
</Install>
产地:
<Install>
<version>
<number>7.0</number>
<build>1032474</build>
<path>path</path>
<kind>RIBS</kind>
</version>
</Install>
我不确定你有什么问题。我只能猜测是因为文字eq
与您在XML文件中的文字不匹配。
所以也许:
if $number -> trimmed_text =~ m/6\.0/;
例如?