访问独立于其名称空间的JDOM元素

时间:2013-11-19 06:44:46

标签: java xml xpath xsd jdom-2

我有一个像下面这样的xml:

<v2:Root xmlns:v2="www.example.com/xsd/">
<ABC>test data</ABC>
<ABC>test data1</ABC>
<ABC>test data2</ABC>
</v2:Root>

当我使用JDOM2访问ABC元素时,我在调试中获取元素值,如

[Element:ABC[Namespace:"www.example.com/xsd/"]].

这就是我无法通过使用Xpath表达式"//ABC"来访问元素的原因。我被迫使用表达式"/*[local-name()='ABC']"。然后它就可以了。

现在,我的要求是仅使用表达式"//ABC"来访问elemnt。有什么办法吗?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我认为你错误地认为你的XML实际上是什么样的。我相信你也必须:

xmlns="www.example.com/xsd/"

在某处,否则您的ABC元素将位于NO_NAMESPACE命名空间中(ABC toString()方法将如下所示:[Element:ABC]

因此,您的XML代码段与ABC Element toString()输出不匹配。

如果您修复了问题,那么建议您的XPath表达式应该更容易。


编辑,假设我没有对默认命名空间进行额外的重新定义,那么您可以使用以下JDOM来获取ABC元素:

XPathFactory xpf = XPathFactory.instance();
Namespace defns = Namespace.getNamespace("defns", "www.example.com/xsd/");
XPathExpression<Element> xpe = xpf.compile("//defns:ABC", Filters.element(), null, defns);
List<Element> abcs = xpe.evaluate(doc);

您应该仔细阅读以下内容from the XPath specification

  

使用表达式上下文中的名称空间声明,将节点测试中的QName扩展为扩展名。这与开始和结束标记中的元素类型名称进行扩展的方式相同,只是不使用使用xmlns声明的默认名称空间:如果QName没有前缀,则名称空间URI为null(这是相同的方式属性名称已扩展)。如果QName具有在表达式上下文中没有名称空间声明的前缀,则会出错。