什么是最有效的xml过滤方式

时间:2014-08-19 11:35:24

标签: xml

我的Xml看起来像这样: 如何为cb =" 1"过滤此xml? ? 我只知道xpath& DataSet是过滤此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>

最有效的方法是什么(按cb = 1过滤):

<root>
   <node id="2">
        <node id="22" cb="1"></node>
   </node>
 </root>

关于, Evgeniy Vinnikov

1 个答案:

答案 0 :(得分:0)

您还没有标记某种语言,因此我将提供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>