使用perl中的xml :: Libxml :: Xpathcontext解析具有多个名称空间的xml

时间:2014-04-08 11:54:47

标签: perl xpath xml-libxml

我必须解析以下XML:

<reply xmlns="urn::ietf::param" xmlns:element="https://xml.example.net/abc/12.3"
message-id='1'>
<abc>
<xyz> hello </xyz>
</abc>
</reply>

我想要xyz节点的值,即hello,但findnodes返回null值。 我的代码是:

 my $xpath=XML::LibXML::XPathContext->new($dom);
    $xpath->registerNs('ns1','urn::ietf::param'); 
    $xpath->registerNs('ns2','https://xml.example.net/abc/12.3');
    $val=$xpath->findnodes('//ns1:reply/ns2:element/abc/xyz'); 
    print $val;

但是print语句返回空值

1 个答案:

答案 0 :(得分:2)

您似乎对名称空间的工作方式存在一些误解。 xmlns:element="https://xml.example.net/abc/12.3"表示使用此特定命名空间URI定义了前缀element。实际上,这个命名空间从未在您的XML中使用过。

xmlns="urn::ietf::param"定义了默认名称空间,也适用于所有后代元素。 实际上,您的XML中没有<element/>元素。

因此,以下XPath应该按预期工作:

//ns1:reply/ns1:abc/ns1:xyz