命名空间感知XML解析 - 映射不在根标记中

时间:2012-04-04 12:31:48

标签: java xml xpath xml-namespaces xerces

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

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

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

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

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

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

我在博客上发现了这个问题,它谈到了Xalan,但我发现Xerces有相同的行为。

  

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

Source

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

假设您使用DOM Level 3 XPath API,那么您需要编写一个实现http://xerces.apache.org/xerces2-j/javadocs/api/org/w3c/dom/xpath/XPathNSResolver.html的类,然后在需要解析XPath表达式中使用的前缀时返回正确的名称空间URI。然后需要将XPathNSResolver作为第三个参数传递给evaluate方法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。正如已经指出的那样,路径表达式中的前缀不需要与XML输入文档中的前缀相同,您只需要确保XPathNSResolver将路径表达式中使用的前缀映射到XML文档中使用的名称空间URI。