我有一个像下面这样的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。有什么办法吗?
提前感谢您的帮助。
答案 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具有在表达式上下文中没有名称空间声明的前缀,则会出错。