Xml 下面的代码不打印输出

Xml 下面的代码不打印输出,xml,perl,parsing,Xml,Perl,Parsing,我想用perl解析xml文件,我想检索Audit标记的值,但并没有生成任何输出 use strict; use warnings; use XML::Simple; use Data::Dumper; my $xml = <<'__EOI__'; <scanJob> <hosts> <host> <audit> <rthID>31406</rthID>

我想用perl解析xml文件,我想检索Audit标记的值,但并没有生成任何输出

use strict;
use warnings;
use XML::Simple;
use Data::Dumper;

my $xml = <<'__EOI__';
<scanJob>
   <hosts>
      <host>
        <audit>
           <rthID>31406</rthID>
           <cve>N/A</cve>
           <cce>N/A</cce>
           <iav>N/A</iav>
           <name>OpenSSH Memory Corruption Vulnerability - (20131108) - Banner</name>
           <description>OpenSSH 6.4 </description>
           <pciReason>Default</pciReason>
           <pciPassFail>Pass</pciPassFail>
           <cvssScore>N/A</cvssScore>
           <fixInformation>Upgrade OpenSSH 6.4 or later.</fixInformation>
           <exploit>No</exploit>
           <context>TCP:22</context>
        </audit>
     </host>
  </hosts>
</scanJob>
__EOI__

my $xs = new XML::Simple;

my $data = $xs->XMLin(\$xml);
for my $scanJob (@{$data->{scanJob} }) {
                for my $hosts (@{$scanJob->hosts }) {
                for my $host (@{$hosts->host }) {
                        for my $audit (@{$host->audit }) {
                                my $rthID   = $audit->{rthID};
                                print $rthID;
                        }
                }
        }
}
使用严格;
使用警告;
使用XML::Simple;
使用数据::转储程序;
我的$xml={scanJob}}){
对于我的$hosts(@{$scanJob->hosts}){
对于我的$host(@{$hosts->host}){
对于我的$audit(@{$host->audit}){
my$rthID=$audit->{rthID};
打印$rthID;
}
}
}
}

您的代码有几个问题,其中一些问题是由于XML::Simple造成的:

  • XML::Simple创建散列,您不能说
    $host->audit
    ,您需要
    $host->{audit}
    (与
    host
    相同)
  • 您是否使用data::Dumper打印了
    $data
    ?创建的不是您所期望的,顶层(
    scanJob
    )不是由XML::Simple创建的,有些级别转换为散列,而不是数组,因为您没有使用uber-important
    ForceArray
    选项a;因此,其中一个元素是
    name
    这一事实在最低级别创建了一个散列
坦率地说,如果您想提取
rthID
值,我的dish XML::Simple和使用XML::LibXML、XML::Twig或XML::XSH2,那么就不会那么麻烦了:

use XML::Twig;
XML::Twig->new( twig_handlers => { rthID => sub { print $_->text, "\n"; } })
         ->parsefile( $file1);


我确信XSH2解决方案将很快在该线程中弹出;--)

您可以发布您试图解析的XML吗?31406 N/A N/A N/A OpenSSH内存损坏漏洞-(20131108)-横幅OpenSSH 6.4默认通过N/A升级OpenSSH 6.4或更高版本。没有TCP:22你不能编辑你的帖子吗?很难从评论中读到我不能正确编辑这个?只想说标记对齐方式如下->->->->->表示RTID是审核的子项,审核是主机的子项,主机是主机的子项,主机是主机的子项scanJob@mirod你能看一下吗?实际上我不想要只有RTID值,它是审计的子标签,我想要检索审计标签的10个子标签值。我现在只提供了1个,也就是说,我只能回答你提出的问题。。。调整XML::Twig或XML::LibXML代码来实现您想要的功能应该不会太困难:对于XML::Twig,在
audit
标记上设置一个处理程序,然后使用
children
,对于XML::LibXML,使用XPath选择
audit
元素,然后获取子元素
use XML::LibXML;
my $data= XML::LibXML->load_xml(location => $file1);
foreach my $rthid (@{$data->findnodes( '//rthID')})
  { print $rthid->textContent, "\n"; }