java 默认 XML 命名空间、JDOM 和 XPath
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/543049/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Default XML namespace, JDOM, and XPath
提问by Michael
I want to use JDOM to read in an XML file, then use XPath to extract data from the JDOM Document. It creates the Document object fine, but when I use XPath to query the Document for a List of elements, I get nothing.
我想使用 JDOM 读取 XML 文件,然后使用 XPath 从 JDOM 文档中提取数据。它很好地创建了 Document 对象,但是当我使用 XPath 查询 Document 以获取元素列表时,我什么也没得到。
My XML document has a default namespace defined in the root element. The funny thing is, when I remove the default namespace, it successfully runs the XPath query and returns the elements I want. What else must I do to get my XPath query to return results?
我的 XML 文档在根元素中定义了一个默认命名空间。有趣的是,当我删除默认命名空间时,它成功运行 XPath 查询并返回我想要的元素。我还必须做什么才能让 XPath 查询返回结果?
XML:
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));
}
回答by AnthonyWJones
XPath 1.0doesn't support the concept of a default namespace (XPath 2.0does). Any unprefixed tag is always assumed to be part of the no-name namespace.
XPath 1.0不支持默认命名空间的概念(XPath 2.0 支持)。任何不带前缀的标签总是被假定为无名命名空间的一部分。
When using XPath 1.0you need something like this:
使用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));
}
回答by Michael Rutherfurd
I had a similiar problem, but mine was that I had a mixture of XML inputs, some of which had a namespace defined and others that didn't. To simplify my problem I ran the following JDOM snippet after loading the document.
我有一个类似的问题,但我的问题是我混合了 XML 输入,其中一些定义了命名空间,而另一些则没有。为了简化我的问题,我在加载文档后运行了以下 JDOM 片段。
for (Element el : doc.getRootElement().getDescendants(new ElementFilter())) {
if (el.getNamespace() != null) el.setNamespace(null);
}
After removing all the namespaces I was able to use simple getChild("elname")style navigation or simple XPath queries.
删除所有命名空间后,我可以使用简单的getChild("elname")样式导航或简单的 XPath 查询。
I wouldn't recommend this technique as a general solution, but in my case it was definitely useful.
我不会推荐这种技术作为通用解决方案,但就我而言,它绝对有用。

