我有一个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的经验,所以我想知道我是否误解了这里是如何构建数组的。有人可以指出我做错了什么以及我应该做些什么呢?
答案 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"/>
...