为什么Java中的XPath表达式会返回太多孩子?

Flu*_*dan 1 java xpath

我有以下xml文件:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<config>
 <a>
  <b>
   <param>p1</param> 
   <param>p2</param> 
  </b>
 </a>
</config>
Run Code Online (Sandbox Code Playgroud)

以及获取我的节点参数的xpath代码:

Document doc = ...;
XPath xpath = XPathFactory.newInstance().newXPath();
XPathExpression expr = xpath.compile("/config/a/b");
Object o = expr.evaluate(doc, XPathConstants.NODESET);
NodeList list = (NodeList) o;
Run Code Online (Sandbox Code Playgroud)

但事实证明,节点列表(列表)有5个孩子,包括"\t\n",而不是只有两个.我的代码有问题吗?我怎样才能得到我的两个节点?

谢谢!

Edd*_*die 5

选择时/config/a/b/,您将选择所有子项b,其中包括三个文本节点和两个元素.也就是说,鉴于上面的XML并且仅显示有问题的片段:

<b>
 <param>p1</param> 
 <param>p2</param> 
</b>
Run Code Online (Sandbox Code Playgroud)

第一个孩子是跟随<b>和前面的文本(空白)<param>p1 ....第二个孩子是第一个param元素.第三个孩子是两个param元素之间的文本(空白).等等.XML中不会忽略空格,尽管许多处理XML的形式都忽略它.

你有几个选择:

  1. 更改你的xpath表达式,使它只选择元素节点,如Ted Dziuba所建议的,或者
  2. 循环返回的五个节点,仅选择非文本节点.

你可以这样做:

for (int i = 0; i < nodes.getLength(); i++) {
    if (nodes.item(i).getNodeType() != Node.TEXT_NODE) {
        System.out.println(nodes.item(i).getNodeValue());
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以使用节点类型仅选择元素节点,或删除文本节点.