我有Xml看起来像这样:我如何过滤这个xml为cb="1"?我只知道xpath &数据集是过滤xml的方法:
<root>
<node id="1">
<node cb="0"></node>
<node cb="0"></node>
</node>
<node id="2">
<node id="21" cb="0"></node>
<node id="22" cb="1"></node>
</node>
</root>
什么是最有效的方法使它像(filter by cb=1):
<root>
<node id="2">
<node id="22" cb="1"></node>
</node>
</root>
与问候,7 Vinnikov
您还没有标记语言,所以我将提供perl作为解决方案。
use strict;
use warnings;
use XML::Twig;
sub process_node {
my ( $twig, $node ) = @_;
if ( $node->has_children ) {
my $match = $node->get_xpath( './node[@cb="1"]', 0 );
if ( not defined $match ) {
$node->delete;
}
}
else {
if ( not defined $node->att('cb')
or not $node->att('cb') eq "1" )
{
$node->delete;
}
}
}
my $twig = XML::Twig->new(
pretty_print => 'indented',
twig_handlers => { 'node' => &process_node, },
)->parse( *DATA );
$twig->print;
__DATA__
<root>
<node id="1">
<node cb="0"></node>
<node cb="0"></node>
</node>
<node id="2">
<node id="21" cb="0"></node>
<node id="22" cb="1"></node>
</node>
</root>
这将产生:
<root>
<node id="2">
<node cb="1" id="22"></node>
</node>
</root>