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

标签 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 返回空值。 我的代码是:

 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 语句返回 null 值

最佳答案

看来您对命名空间的工作原理存在一些误解。 xmlns:element="https://xml.example.net/abc/12.3"表示有前缀 element使用此特定命名空间 URI 定义。实际上,您的 XML 中从未使用过此 namespace 。

xmlns="urn::ietf::param"定义默认 namespace 并且也适用于所有后代元素。 实际上你没有<element/> XML 中的元素。

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

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

关于perl - 在 perl 中使用 xml::Libxml::Xpathcontext 解析具有多个命名空间的 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22936251/

相关文章:

json - api 网关 CORS 设置

perl - 如何防止 XML::LibXML 使用自闭标记保存修改后的 xml

xml - 在 @INC 中找不到 XML/LibXML/Element.pm

xml - XPath查询不匹配任何值

javascript - 使用 "//script[contains (@src, ' blah') 查找异步脚本

xml - 在 R 中是否有更好的方法来完成这个 XML 抓取任务?

xml - 在 Perl 中使用 XML::LibXML 更改 XML 文件:换行符是 Unix,不是 Windows

linux - 有比 libnotify 更好的东西吗?

perl - 在 Perl 中,如何用零填充数组?

linux - 系统命令返回是什么?