Dom4j的selectNodes(arg)方法无法返回节点列表。

8

我在Java中使用DOM4j处理XML, 我的XML如下:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<abcd name="ab.catalog" xmlns="http://www.xyz.com/pqr" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.xyz.com/pqr ./abc.xyz.xsd">             
<efg>
......
</efg>
<efg>
.....
</efg>
</abcd>

那么,该如何做呢?
List<Node>list = document.selectNodes("/abcd/efg");

获取列表零的大小。我觉得这是由于xml中指定的命名空间问题。我尝试了很多次,但没有成功。

2个回答

14

在XPath表达式中未加前缀的元素名称指代不带命名空间的元素,它们不考虑文档中声明的“默认”命名空间xmlns="..."。您需要在XPath引擎中为命名空间声明一个前缀,然后在表达式中使用该前缀。以下示例受到DOM4J javadocs的启发:

Map uris = new HashMap();
uris.put("pqr", "http://www.xyz.com/pqr");
XPath xpath = document.createXPath("/pqr:abcd/pqr:efg");
xpath.setNamespaceURIs(uris);
List<Node> nodes = xpath.selectNodes(document);

@ Ian:谢谢,它起作用了,但我有一个问题,如果我必须检索子节点中的更多节点或节点值,则我尝试与上面指定的相同方式进行,例如
for(Node node:nodes){ XPath xpath1 = document.createXPath("// edx:Name / value- "); xpath1.setNamespaceURIs(uris); Node nameNode =(Node)xpath1.selectSingleNode(node); } 但是它会返回nameNode null。如何使其像dom4j一样可行。任何输入都将不胜感激。
- user1808932
@user1808932 //edx:Name/value- 是一个绝对路径,它将从包含 node 的文档的根节点开始查找。如果您想要当前 nodeedx:Name 后代,则需要使用相对路径 .//edx:Name/value-(带有前导点)。 - Ian Roberts

-5
修改你的代码:
List<Node>list = document.selectNodes("//abcd/efg");

4
这不是真的。//语法与命名空间无关。 - Martin Serrano
这个答案完全错误,应该被删除。 - kjhughes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接