我只是想从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的链接答案 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}}选项?