Perl Twig删除不按预期工作

时间:2015-07-28 13:16:37

标签: xml perl

我正在尝试使用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并返回上述错误如果我交换节点的位置就会发生同样的事情。

1 个答案:

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

例如?