题
我想使用jdom在XML文件中读取,然后使用XPath从JDOM文档中提取数据。它可以创建文档对象罚款,但是当我使用XPath查询文档以获取元素列表时,我什么也没得到。
我的XML文档具有根元素中定义的默认名称空间。有趣的是,当我删除默认名称空间时,它成功运行XPath查询并返回我想要的元素。我还必须采取什么措施才能获取我的Xpath查询以返回结果?
XML:
<?xml version="1.0" encoding="UTF-8"?>
<collection xmlns="http://www.foo.com">
<dvd id="A">
<title>Lord of the Rings: The Fellowship of the Ring</title>
<length>178</length>
<actor>Ian Holm</actor>
<actor>Elijah Wood</actor>
<actor>Ian McKellen</actor>
</dvd>
<dvd id="B">
<title>The Matrix</title>
<length>136</length>
<actor>Keanu Reeves</actor>
<actor>Laurence Fishburne</actor>
</dvd>
</collection>
Java:
public static void main(String args[]) throws Exception {
SAXBuilder builder = new SAXBuilder();
Document d = builder.build("xpath.xml");
XPath xpath = XPath.newInstance("collection/dvd");
xpath.addNamespace(d.getRootElement().getNamespace());
System.out.println(xpath.selectNodes(d));
}
解决方案
XPATH 1.0 不支持默认名称空间的概念(XPATH 2.0 做)。始终认为任何未修复的标签都是无名名称空间的一部分。
使用时 XPATH 1.0 您需要这样的东西:
public static void main(String args[]) throws Exception {
SAXBuilder builder = new SAXBuilder();
Document d = builder.build("xpath.xml");
XPath xpath = XPath.newInstance("x:collection/x:dvd");
xpath.addNamespace("x", d.getRootElement().getNamespaceURI());
System.out.println(xpath.selectNodes(d));
}
其他提示
我遇到了一个类似的问题,但是我的是我有XML输入的混合物,其中有些有一个名称空间,而另一些则没有。为了简化我的问题,我在加载文档后运行了以下JDOM片段。
for (Element el : doc.getRootElement().getDescendants(new ElementFilter())) {
if (el.getNamespace() != null) el.setNamespace(null);
}
删除所有名称空间后,我可以使用简单 GetChild(“ Elname”) 样式导航或简单的XPath查询。
我不建议这种技术作为一般解决方案,但就我而言,这绝对是有用的。
不隶属于 StackOverflow