Xml 下面的代码不打印输出
我想用perl解析xml文件,我想检索Audit标记的值,但并没有生成任何输出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>
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
)不是由XML::Simple创建的,有些级别转换为散列,而不是数组,因为您没有使用uber-importantscanJob
选项a;因此,其中一个元素是ForceArray
这一事实在最低级别创建了一个散列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"; }