最近,我们遇到了一些不寻常的XML问题。 假设,XML看起来像
<rootNode>
<childNode xmlns = "http://default.namespace.com">
<targetNode>
some_text
</targetNode>
</childNode>
</rootNode>
我们的目标是通过XPath从此XML获取 some_text 。 如您所见, rootNode 根本没有名称空间,但另一个节点具有默认名称空间。
通常,我们对XPath(在NameSpace上下文中)的方法如下:我们首先循环抛出文档并收集所有名称空间和前缀。然后我们将此信息设置为 NamespaceContext ,并计算XPath。在此之前感到高兴。
在这种情况下,这样的XPath来获取 some_text
/rootNode/childNode/targetNode
无效,导致Java认为 rootNode 还有http://default.namespace.com命名空间,这是不正确的。
所以,问题是:在这种情况下如何编写正确的XPath?
到目前为止,我们发现只有这种解决方法:写了类似
的内容/NonExistingPrefix:rootNode/childNode/targetNode
这是有效的,因为文档没有 NonExistingPrefix 的命名空间,并且因为这个Java对待
/NonExistingPrefix:rootNode
作为
pure /rootNode without namespace
- 正是我们需要的。
但这种做法看起来很丑陋。