Perl使用XML Path Context来提取数据

时间:2012-10-10 04:24:52

标签: perl xml-parsing xml-libxml

我有以下xml

<?xml version="1.0" encoding="utf-8"?>
<Response>
   <Function Name="GetSomethingById">
      <something idSome="1" Code="1" Description="TEST01" LEFT="0" RIGHT="750" />
   </Function>
</Response>

我希望<something>节点的属性作为哈希。我试着像下面

my $xpc = XML::LibXML::XPathContext->new(
    XML::LibXML->new()->parse_string($xml)   # $xml is containing the above xml
);
my @nodes = $xpc->findnodes('/Response/Function/something');

我希望有$nodes[0]->getAttributes之类的东西,有什么帮助吗?

3 个答案:

答案 0 :(得分:5)

my %attributes = map { $_->name => $_->value } $node->attributes();

答案 1 :(得分:2)

您的XPATH查询似乎错了 - 您正在搜索'/WSApiResponse/Function/something',而您的XML的根节点是Response而不是WSApiResponse

来自XML::LibXML::Node的文档(findnodes()预期返回的内容),您应该寻找my $attrs = $nodes[0]->attributes()而不是$nodes[0]->getAttributes

答案 2 :(得分:0)

我将XML::Simple用于此类事情。因此,如果XML文件是data.xml

use strict;
use XML::Simple();
use Data::Dumper();

my $xml = XML::Simple::XMLin( "data.xml" );
print Data::Dumper::Dumper($xml);
my $href = $xml->{Function}->{something};
print Data::Dumper::Dumper($href);

注意:使用XML :: Simple,根标记映射到结果哈希本身。因此没有$xml->{Response}