0

我有一个如下的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"。有什么办法吗?

提前感谢您的帮助。

4

1 回答 1

0

我认为您对 XML 的实际外观有误。我相信你还必须有:

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

在那里的某个地方,否则你的ABC元素将在NO_NAMESPACE命名空间中(ABC toString() 方法看起来像[Element:ABC]:)

Element因此,您的 XML 片段与 ABC 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);

您应该仔细阅读XPath 规范中的以下摘录:

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

于 2013-11-19T06:55:31.663 回答