3

我的 XML 文件如下所示:

<eLinkResult>
  <LinkSet>
    <DbFrom>nuccore</DbFrom>
    <IdList>
      <Id>133909243</Id>
    </IdList>
    <LinkSetDb>
      <DbTo>taxonomy</DbTo>
      <LinkName>nuccore_taxonomy</LinkName>
      <Link>
        <Id>417290</Id>
      </Link>
      <Link>
        <Id>417289</Id>
      </Link>
      <Link>
        <Id>405948</Id>
      </Link>
    </LinkSetDb>
  </LinkSet>
</eLinkResult>

我正在寻找所有<Id>信息,如果有这样的信息,我知道如何提取<Id>

my $test="Some URL;
      my $Result = get ($test);
      my $Data = $Parser->XMLin($Result);
my $x=0;
if (exists($Data->{LinkSet}{LinkSetDb}->[0]->{Link}{Id})) {
    $TaxId=$Data->{LinkSet}{LinkSetDb}{Link}->[0]->{Id};

要不就

if (exists($Data->{LinkSet}{LinkSetDb}{Link}{Id})) {
    $TaxId=$Data->{LinkSet}{LinkSetDb}{Link}{Id};
}

但是,当我尝试使用上面的 XML 文件时,我得到Not a HASH reference

我也试过

foreach  (@{$Data->{LinkSet}{LinkSetDb}{Link}{Id}}) {
Print $_;
}

但是我仍然得到一个错误,有没有办法让我可以在<Id>不指定我想要哪个的情况下获得所有?

4

2 回答 2

2

尝试使用 parser XML::Twig

内容script.pl

#!/usr/bin/env perl

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

my $twig = XML::Twig->new(
    twig_handlers => {
        'LinkSet/LinkSetDb/Link/Id' => sub {
            printf qq|%s\n|, $_->text_only;
        },  
    },  
)->parsefile( shift );

使用 xml 文件作为输入参数运行它,例如:

perl script.pl xmlfile

这会产生:

417290
417289
405948
于 2013-06-05T21:29:05.943 回答
2

XML::Simple很少是处理 XML 的好选择。它不能准确地表示 XML 数据结构,并且根据我的经验,它的使用远非简单,因为它创建的 Perl 数据结构难以预测且难以导航。

XML::LibXMLXML::Twig是很好的候选者,虽然XML::Twig可以用来逐个处理大型 XML 文件,但没有理由这样使用它。

这个简短的程序用于读取完整的数据结构并打印所有元素XML::Twig的文本值。Id

use strict;
use warnings;

use XML::Twig;

my $twig = XML::Twig->new;
$twig->parsefile('xml.xml');
print $_->text, "\n" for $twig->findnodes('//Id');

输出

133909243
417290
417289
405948

更新

如果您只想要数据部分中的Id元素LinkSetDb而不是里面的元素IdList,那么将findnodes调用更改为$twig->findnodes('//Link/Id')

于 2013-06-05T23:21:48.943 回答