XML 在不同级别上具有相同的标记名称

  • 本文关键字:XML xml perl xml-libxml
  • 更新时间 :
  • 英文 :


我正在尝试使用Perl XML::LibXML::reader模块解析xml文档。该模块运行良好,我能够解析大部分文档,但是xml上的某些部分可以在不同级别上具有多个具有相同名称的元素,我不知道如何分配和处理这些元素,

我正在尝试做的是将下面的 strcutre 转换为我尝试使用 XML::Simple 和 XML::Twig smplify 子例程(见下文)以及 XML::LibXML,但用它们解析本节非常慢(x20 比解析没有它们的文档慢),

 my @conf= eval{($copy->findnodes('criteria'))};
 my $t= XML::Twig->new();
  my $hash=$t->parse($_->toString)->simplify(forcearray =>1  ]);
  $t->purge();

有人可以建议我如何以更快的方式解析以下部分以方便使用 XML::LibXML::reader 的 Perl 数据结构。任何帮助都值得赞赏

 example of such file :
 <criteria operator="OR">
    <criteria operator="AND">  -> nested element
    <criterion test_ref="oval:org.mitre.oval:tst:123" comment="Windows XP is installed"/>
    <criterion test_ref="oval:org.mitre.oval:tst:234" comment="file foo.txt exists"/>
    <criteria operator="OR"> -> nested element
    <criterion test_ref="oval:org.mitre.oval:tst:127" comment="file x.txt exists"/>
    <criterion test_ref="oval:org.mitre.oval:tst:127" comment="file y.txt exists"/>
    </criteria> 
     </criteria> 
    <criteria operator="AND" negate="true"> ->nested element
    <criterion test_ref="oval:org.mitre.oval:tst:345" comment="Windows 2003 is installed"/>
    <criterion test_ref="oval:org.mitre.oval:tst:456" comment="file fred.txt has a version less than 2"/>
    <criterion test_ref="oval:org.mitre.oval:tst:567" negate="true" comment=patch is installed"/>
    </criteria>
    <criterion test_ref="oval:org.mitre.oval:tst:345" comment="Windows 2003 is installed"/>
 </criteria>

我不确定您要simplify您的XML。看着它,您正在寻找的工具是 XML::Twig 中的树枝处理程序。

例如:

#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
use Data::Dumper;
my $xml = q{ <criteria operator="OR">
    <criteria operator="AND">  -> nested element
    <criterion test_ref="oval:org.mitre.oval:tst:123" comment="Windows XP is installed"/>
    <criterion test_ref="oval:org.mitre.oval:tst:234" comment="file foo.txt exists"/>
    <criteria operator="OR"> -> nested element
    <criterion test_ref="oval:org.mitre.oval:tst:127" comment="file x.txt exists"/>
    <criterion test_ref="oval:org.mitre.oval:tst:127" comment="file y.txt exists"/>
    </criteria> 
     </criteria> 
    <criteria operator="AND" negate="true"> ->nested element
    <criterion test_ref="oval:org.mitre.oval:tst:345" comment="Windows 2003 is installed"/>
    <criterion test_ref="oval:org.mitre.oval:tst:456" comment="file fred.txt has a version less than 2"/>
    <criterion test_ref="oval:org.mitre.oval:tst:567" negate="true" comment="patch is installed"/>
    </criteria>
    <criterion test_ref="oval:org.mitre.oval:tst:345" comment="Windows 2003 is installed"/>
 </criteria> };
my %test_hash;
sub process_criteria {
    my ( $twig, $criteria ) = @_;
    foreach my $criterion ( $criteria->children('criterion') ) {
        my $ref     = $criterion->att('test_ref');
        my $comment = $criterion->att('comment');
        $test_hash{$ref} = $comment;
    }
}
my $twig =
    XML::Twig->new( twig_handlers => { criteria => &process_criteria } )
    ->parse($xml);
print Dumper %test_hash;

现在,我不确定这是否完全符合您的要求,但更多的是说明如何处理问题。

相关内容

  • 没有找到相关文章

最新更新