1

我正在使用 Xerces 2.9.1 执行一些 XML 解析。XML 包含命名空间,我将 Xerces 配置为可感知命名空间。

我定义了两个前缀,reccom。rec 在根标签中定义,com在每个使用它的节点中声明。

<rec:root xmlns:rec="...">
   <rec:dummy ...>
      <com:item xmlns:com="..." />
    ...

解析以下 XPath 表达式时出现异常:

/rec:root/rec:dummy/com:item

XPathStylesheetDOM3Exception:前缀必须解析为命名空间:com

我在博客上找到了这个,它谈到了 Xalan,但我观察到 Xerces 具有相同的行为。

好吧,你可能会争论一个设计缺陷,因为它只使用在传递给它的节点上找到的映射,即在我们的例子中,到顶级名称空间声明。因此,让我们将命名空间声明移至顶层,以获取以下 XML 输入

来源

xmlns:com移动到根标记可以解决问题,但我无法控制该文件。

4

2 回答 2

4

xpath 前缀与文档中使用的前缀无关。您需要为 xpath 处理程序提供“名称空间的前缀”映射。使用标准的 java DOM 工具,您可以为XPath 实例提供一个NamespaceContext 。

于 2012-04-04T12:47:28.713 回答
2

Assuming you use the DOM Level 3 XPath API then you need to write a class implementing http://xerces.apache.org/xerces2-j/javadocs/api/org/w3c/dom/xpath/XPathNSResolver.html which then returns the right namespace URI when a prefix used in the XPath expression needs to be resolved. That XPathNSResolver then needs to be passed as the third argument to the evaluate method http://xerces.apache.org/xerces2-j/javadocs/api/org/w3c/dom/xpath/XPathEvaluator.html#evaluate%28java.lang.String,%20org.w3c.dom.Node,%20org.w3c.dom.xpath.XPathNSResolver,%20short,%20java.lang.Object%29. As already pointed out, the prefixes in the path expression do not need to be the same as in the XML input document, you simply need to make sure the XPathNSResolver maps prefixes used in the path expressions to the namespace URIs used in the XML document.

于 2012-04-04T13:14:26.390 回答