【发布时间】:2018-03-01 08:54:40
【问题描述】:
我有一个包含许多 level3 元素的 xml 文件。我想删除除一个这样的元素之外的所有元素。我的xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<level1 id="level1_id">
<level2 id="level2_id">
<level3 id="level3_id1">
<attributes>
<attribute>1</attribute>
<attribute>2</attribute>
</attributes>
</level3>
<level3 id="level3_id2">
<attributes>
<attribute>1</attribute>
<attribute>2</attribute>
</attributes>
</level3>
<level3 id="level3_id3">
<attributes>
<attribute>1</attribute>
<attribute>2</attribute>
</attributes>
</level3>
</level2>
</level1>
我的 perl 脚本:
my $filename = 'test3.xml';
my $outfile = $filename."_after";
open my $output, '>', $outfile or die "Couldn't open output file\n";
my $twig = new XML::Twig (twig_handlers => { 'level2' => \&edit });
$twig->parsefile($filename);
#$twig->flush;
$twig->print($output);
sub edit {
my ($twig, $element) = @_;
my @elements= $element->children('level3');
print $#elements."\n";
my @elements= @elements[1..$#elements];
print $#elements."\n";
my $count = 0;
foreach (@elements){
$count++;
$_->delete;
}
print $count;
$twig->purge;
}
这只是留下了 level1 元素:
<?xml version="1.0" encoding="UTF-8"?>
<level1 id="level1_id"></level1>
另一方面,当顶层是 level2 时,我的脚本工作得很好。示例xml文件及处理后的结果:
<?xml version="1.0" encoding="UTF-8"?>
<level2 id="level2_id">
<level3 id="level3_id1">
<attributes>
<attribute>1</attribute>
<attribute>2</attribute>
</attributes>
</level3>
<level3 id="level3_id2">
<attributes>
<attribute>1</attribute>
<attribute>2</attribute>
</attributes>
</level3>
<level3 id="level3_id3">
<attributes>
<attribute>1</attribute>
<attribute>2</attribute>
</attributes>
</level3>
</level2>
结果:
<?xml version="1.0" encoding="UTF-8"?>
<level2 id="level2_id">
<level3 id="level3_id1">
<attributes>
<attribute>1</attribute>
<attribute>2</attribute>
</attributes>
</level3>
</level2>
这正是我想要的,即只剩下一个 level3 元素。我究竟做错了什么?这与我如何定义树枝处理程序有关吗? 我不想对 xml 结构进行硬编码,例如我的 $twig = new XML::Twig (twig_handlers => { 'level1/level2' => \&edit }); 我不知道在实际的 xml 文件中 level2 有多深,实际文件的结构可能不完全相同,所以这部分应该是动态的
【问题讨论】: