2014-01-15 80 views
-1

我想用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; 
         } 
       } 
     } 
} 
+3

你可以发布你正在试图解析XML? – mirod

+0

\t \t \t \t \t \t \t \t \t \t \t \t \t \t N/A \t \t \t \t N/A \t \t \t \t N/A \t \t \t \t OpenSSH的内存损坏漏洞 - (20131108) - 横幅 \t \t \t \t OpenSSH的6.4 \t \t \t \t 默认 \t \t \t个\t \t \t \t \t N/A \t \t \t \t 升级OpenSSH的6.4或更高版本。 \t \t \t \t 没有 \t \t \t \t TCP:22 \t \t \t \t \t \t

+0

你不能编辑您的帖子?很难从评论中读取 – mirod

回答

1

有几个与你的代码,他们中的一些由于XML问题::简单:

  • XML ::简单的创建哈希,你不能说$host->audit,你需要$host->{audit} (与host相同)
  • 是否打印$data with Data :: Dumper?创建的内容不是您期望的内容,顶级(scanJob)不是由XML :: Simple创建的,因为您没有使用超重要的ForceArray选项,所以某些级别转换为散列,而不是阵列, ;这样的事实要素之一是name建立在最低水平的哈希

坦率地说,如果你想提取rthID值,我的菜XML ::简单,使用XML ::的libxml,XML: :枝杈或XML :: XSH2,那将是更头疼:

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

use XML::LibXML; 
my $data= XML::LibXML->load_xml(location => $file1); 
foreach my $rthid (@{$data->findnodes('//rthID')}) 
    { print $rthid->textContent, "\n"; } 

我相信一个XSH2解决方案将很快在这个线程弹出; - )

+0

其实我不想只是rthID值,它是审计的子标记,我想检索审计标记的10个子标记值。我现在只提供了1个,也就是rthID –

+1

,我只能回答你提出的问题......要调整XML :: Twig或XML :: LibXML代码来做你想做的事情不应该太难尽管:对于XML :: Twig,在audit标签上设置一个处理程序,然后使用children,对于XML :: LibXML,使用XPath选择audit元素,然后获取子元素 – mirod