在一般情况下,基于 XML 文档中的所有命名空间声明设置一致的命名空间解析是不可能的,例如,
<root xmlns="http://example.com/n1">
<foo xmlns="http://example.com/n2">
<p1:bar xmlns:p1="http://example.com/n1">
<p2:baz xmlns:p2="http://example.com/n1">...</p2:baz>
</p1:bar>
</foo>
</root>
其中相同的命名空间使用不同的前缀,当然您可以有示例,例如
<p:foo xmlns:p="http://example.com/n1">
<p:bar xmlns:p="http://example.com/n2">...</p:bar>
</p:foo>
其中相同的前缀绑定到不同元素上的不同名称空间 URI。
所以基本上你需要知道你正在寻找的元素节点的命名空间 URI,然后你可以使用你的代码可以选择的任何前缀来设置命名空间解析器,例如
return xmlDoc.evaluate("//pf:key", xmlDoc, function(prefix) { if (prefix === 'pf' return 'http://schemas.datacontract.org/2004/07/System.Collections.Generic'; else return null; }, XPathResult.ANY_TYPE, null);
另一方面,对于这个简单的路径,我不会使用 XPath 和evaluate
根本不去,而是去追求return xmlDoc.getElementsByTagNameNS('http://schemas.datacontract.org/2004/07/System.Collections.Generic', 'b');
.
至于在 DOM 树中查找名称空间声明以根据前缀自行构建名称空间解析器,XPath 可以通过查看名称空间轴来提供一些帮助,例如//namespace::*
但在浏览器内部,Mozilla/Firefox 从未认为有必要支持命名空间轴。然后还有一些 DOM Level 3 的方法http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-lookup 命名空间前缀 http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-lookupNamespacePrefix and http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-lookupNamespaceURI http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-lookupNamespaceURI因此您可以编写自己的代码遍历 DOM 树并收集命名空间声明,但这在一般情况下无助于解决我上面发布的两个示例中概述的问题。