如何使用XML :: Simple检索标记属性?

时间:2009-03-18 05:20:43

标签: xml perl

我只是想从XML中检索属性到我的Perl程序中。但是,我在检索属性时遇到问题。

我正在使用XML::Simple

当XML如下所示,我可以很好地恢复信息:

<IdList>
    <Id>17175540</Id>
</IdList>

使用此代码

 $data->{'DocSum'}->{'Id'};

然而,当XML是这样的时候:

<Item Name="Title" Type="String">
    Some Title
</Item>

使用以下代码时,我没有收到任何数据

$data->{'DocSum'}->{'Title'};

BTW,这是我从http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id=19288470

获取XML的链接

5 个答案:

答案 0 :(得分:4)

运行:

$ perl -MXML::Simple -M'Data::Dump qw/pp/' 
my $ref = XMLin('<Item Name="Title" Type="String">Some Title</Item>');
pp $ref;

输出:

{ Name => "Title", Type => "String", content => "Some Title" }

所以,看起来你应该在'内容'下查找它。

答案 1 :(得分:3)

我从您提供的页面中获取了xml,将整个事物用作XMLin参数的字符串,并且成功了

print $data->{DocSum}->{Item}->[5]->{content};

给出输出

  

密西西比淤泥土壤中溴苯腈的降解。

这与德罗伯特所说的几乎相同。

编辑:

不是假设第6个Item元素是你所追求的元素,而是打印Name属性为'Title'的节点的内容(然后在你找到你想要的东西后突破循环):

foreach my $item_node (@{$data->{DocSum}->{Item}})
{
    if($item_node->{Name} eq 'Title')
    {
        print $item_node->{content};
        last;
    }
}

当然,这仍然只是在DocSum下查看Item节点,因此如果您正在寻找PubType而不是Title,那么由于它是PubTypeList Item节点的子节点而无法找到它。

答案 2 :(得分:2)

我猜你使用XML :: Simple来解析XML。 我建议您使用Data::Dumper转储数据结构。你应该可以很容易地找到它。

use Data::Dumper;
print Dumper($data);

答案 3 :(得分:2)

但当然,'Title'不是键,而是属性值,因此是哈希值。您需要XPath,然后您可以指定/DocSum/Item[@Name='Title']

XML :: Simple(或 Perl )中的等价物是

my ( $item ) = grep { $_->{Name} eq 'Title' } @{$data->{DocSum}{Item}};

甚至

use List::Util qw<first>;
...
( first { $_->{Name} eq 'Title' } @{$data->{DocSum}{Item}} )->{content};

我不同意daotoad。据我所知,它并没有改变错误的数据。你只是正在使用正确生成的东西。它是一个简单模块,它不健壮,而且不是DWIM。

答案 4 :(得分:1)

看起来XML :: Simple猜测如何转换数据是错误的。您是否尝试过更改XMLin()的{​​{3}}选项?