用XML::Twig解析嵌套的椭圆文件

用XML::Twig解析嵌套的椭圆文件,xml,perl,xml-twig,Xml,Perl,Xml Twig,我有下面的OVAL定义,希望解析它并将其存储在特定的perl对象(如array ref)上,然后作为对象访问它 例如,访问以下xml的第一个注释属性: <criteria operator="OR"> <criteria operator="AND"> <criterion test_ref="oval:org.mitre.oval:tst:123" comment="Windows XP is installed"/> &l

我有下面的OVAL定义,希望解析它并将其存储在特定的perl对象(如array ref)上,然后作为对象访问它

例如,访问以下xml的第一个注释属性:

    <criteria operator="OR">

    <criteria operator="AND">
    <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>
    <criteria operator="AND" negate="true">
    <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>




it will be somthing like this:

        $arr->[0]->[1]->{oval-org-mitre-oval-tst-123}->{comment}


您可以尝试使用
twig\u handlers()
选择
元素,并在元素内部选择
元素和
子元素()
,然后将任一属性保存在推送到数组ref变量中的哈希中

#!/usr/bin/env perl

use warnings;
use strict;
use XML::Twig;

my $arr = []; 

XML::Twig->new(
    twig_handlers => {
        'criteria' => sub {
            my %hash;
            for my $child ( $_->children( 'criterion' ) ) { 
                $hash{ 
                    do { (my $k = $child->att('test_ref')) =~ tr/:./-/; $k } } = 
                        $child->att( 'comment' );
            }   
            push @$arr, { %hash };
        },  
    },  
)->parsefile(shift);

## print $arr->[0]
## or
## print $arr->[0]{'oval-org-mitre-oval-tst-123'}
使用固定的
xml
文件,
$arr
将类似于:

0  ARRAY(0x25f9200)
   0  HASH(0x3613958)
      'oval-org-mitre-oval-tst-123' => 'Windows XP is installed'
      'oval-org-mitre-oval-tst-234' => 'file foo.txt exists'
   1  HASH(0x360e068)
      'oval-org-mitre-oval-tst-345' => 'Windows 2003 is installed'
      'oval-org-mitre-oval-tst-456' => 'file fred.txt has a version less than 2'
      'oval-org-mitre-oval-tst-567' => 'patch is installed'
   2  HASH(0x3613430)
      'oval-org-mitre-oval-tst-345' => 'Windows 2003 is installed'

您可以尝试使用
twig\u handlers()
选择
元素,并在元素内部选择
元素和
子元素()
,然后将任一属性保存在推送到数组ref变量中的哈希中

#!/usr/bin/env perl

use warnings;
use strict;
use XML::Twig;

my $arr = []; 

XML::Twig->new(
    twig_handlers => {
        'criteria' => sub {
            my %hash;
            for my $child ( $_->children( 'criterion' ) ) { 
                $hash{ 
                    do { (my $k = $child->att('test_ref')) =~ tr/:./-/; $k } } = 
                        $child->att( 'comment' );
            }   
            push @$arr, { %hash };
        },  
    },  
)->parsefile(shift);

## print $arr->[0]
## or
## print $arr->[0]{'oval-org-mitre-oval-tst-123'}
使用固定的
xml
文件,
$arr
将类似于:

0  ARRAY(0x25f9200)
   0  HASH(0x3613958)
      'oval-org-mitre-oval-tst-123' => 'Windows XP is installed'
      'oval-org-mitre-oval-tst-234' => 'file foo.txt exists'
   1  HASH(0x360e068)
      'oval-org-mitre-oval-tst-345' => 'Windows 2003 is installed'
      'oval-org-mitre-oval-tst-456' => 'file fred.txt has a version less than 2'
      'oval-org-mitre-oval-tst-567' => 'patch is installed'
   2  HASH(0x3613430)
      'oval-org-mitre-oval-tst-345' => 'Windows 2003 is installed'

您的
xml
格式不正确。它至少漏掉了一个双引号和一个开始标记。谢谢你的回答,我更正了我的xml,但是如果我在内部crteria中有另一个嵌套的criteria,我如何构建一个嵌套对象,例如:criteria1->ctriteria2->criteria3->criteria\u comments,你没有修复它。你改变了规格。这很不一样,现在你让我的答案无效了。很抱歉,你的答案仍然有用你的
xml
格式不正确。它至少漏掉了一个双引号和一个开始标记。谢谢你的回答,我更正了我的xml,但是如果我在内部crteria中有另一个嵌套的criteria,我如何构建一个嵌套对象,例如:criteria1->ctriteria2->criteria3->criteria\u comments,你没有修复它。你改变了规格。这很不一样,现在你让我的答案无效了。我很抱歉,但是你的答案仍然是有用的,即使你的答案不是直接回答我的问题,它也是有帮助的,即使你的答案不是直接回答我的问题,它也是有帮助的