删除perl中xml文件中每个节点的第一个子节点

时间:2016-06-29 07:18:07

标签: xml perl

我有一个XML文件,其中节点的第一个子节点都是空的,所以我想使用XML::Twig删除它们。 XML文件可能如下所示:

<stuff>
    <a>
        <b id=""/>
        <b id="2"/>
        <b id="3"/>
        <b id="4"/>
    </a>
    <a>
        <b id=""/>
        <b id="5"/>
    </a>
    <a>
        <b id=""/>
        <b id="6"/>
        <b id="7"/>
        <b id="8"/>
        <b id="9"/>
        <b id="10"/>
        <b id="11"/>
    </a>
    <a>
        <b id=""/>
        <b id="12"/>
        <b id="13"/>
        <b id="14"/>
    </a>
</stuff>

所以我要做的是删除每个给定<b>节点的每个第一个<a>子节点。我尝试这样做的方式来自XML::Twig site on CPAN

my @a = $root->children('a');
foreach my $delA (@a) {
    $delA->first_child->delete();
}

但它不起作用。我没有很多Perl的经验,所以我想知道我是否误解了这里是如何构建数组的。有人可以指出我做错了什么以及我应该做些什么呢?

2 个答案:

答案 0 :(得分:2)

8

然而,看起来就像您正在使用&#39; null ids&#39;删除节点。

那怎么样:

This seems to do the trick:

#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;

my $twig = XML::Twig -> new ( pretty_print => 'indented_a') -> parsefile('sample.xml');

foreach my $element ( $twig -> get_xpath('./a') ) {
   $element -> first_child('b') -> delete;
}
$twig -> print; 

(注意:如果你想在结构中的任何地方使用$_ -> delete for $twig -> get_xpath('./a/b[@id=""]'); ,可以使用{/ 1}}

答案 1 :(得分:1)

您的代码适用于我,就像它一样。

use strict;
use warnings;
use XML::Twig;

my $file = 'data_sample.xml';
my $t = XML::Twig->new(pretty_print => 'indented');
$t->parsefile( $file );
my $root = $t->root;

my @kids = $root->children('a');
# $_->print for @kids;

foreach my $delA (@kids) {
    $delA->first_child->delete();
}

$_->print for @kids;

该图片显示first_child处的空元素已消失

<a>
  <b id="2"/>
  <b id="3"/>
  <b id="4"/>
</a>
<a>
  <b id="5"/>
</a>
<a>
  <b id="6"/>
  ...