Perl 使用 XML Path Context 提取数据

Posted

技术标签:

【中文标题】Perl 使用 XML Path Context 提取数据【英文标题】:Perl using XML Path Context to extract out data 【发布时间】:2012-09-30 11:38:28 【问题描述】:

我有以下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>

我想要&lt;something&gt; 节点的属性作为散列。我尝试如下

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]-&gt;getAttributes 的东西,有什么帮助吗?

【问题讨论】:

【参考方案1】:
my %attributes = map  $_->name => $_->value  $node->attributes();

【讨论】:

工作就像一个魅力:) thnx 很多。【参考方案2】:

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

XML::LibXML::Node 的文档(findnodes() 预计会返回的那种东西),您应该寻找my $attrs = $nodes[0]-&gt;attributes() 而不是$nodes[0]-&gt;getAttributes

【讨论】:

啊.. 复制粘贴时打错字了...非常抱歉让您感到困惑。【参考方案3】:

我使用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-&gt;Response

【讨论】:

我也是。 XML::Simple 是要走的路。 为什么你认为只能有一个Function? XML::Simple 是最复杂的 XML 模块。 感谢您的回复...不过,@ikegami 的解决方案正是我所需要的。

以上是关于Perl 使用 XML Path Context 提取数据的主要内容,如果未能解决你的问题,请参考以下文章

在 perl 中提取 tar.gz 文件

在 context.xml 中配置 jdbcRealm

tomcat server.xml 能否设置多个 context

使用 perl 提取 tar.gz 文件时内存不足

tomcat中server.xml中的context配置

tomcat的Context配置,虚拟访问数据