簡體   English   中英

為什么Java中的XPath表達式返回太多子級?

[英]Why does my XPath expression in Java return too many children?

我有以下xml文件:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<config>
 <a>
  <b>
   <param>p1</param> 
   <param>p2</param> 
  </b>
 </a>
</config>

和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;

但是事實證明,節點列表(列表)有5個子節點,其中包括"\\t\\n" ,而不僅僅是兩個。 我的代碼有問題嗎? 我怎樣才能得到兩個節點?

謝謝!

選擇/config/a/b/ ,將選擇b 所有子級,其中包括三個文本節點和兩個元素。 也就是說,鑒於您的XML以上,並且僅顯示了相關片段:

<b>
 <param>p1</param> 
 <param>p2</param> 
</b>

第一個子項是<b><param>p1 ...之前的文本(空格)。 第二個孩子是第一個param元素。 第三個孩子是兩個param元素之間的文本(空白)。 等等。 盡管許多處理XML的形式都忽略了XML,但在XML中並未忽略空格。

您有兩種選擇:

  1. 根據Ted Dziuba的建議,更改xpath表達式,使其僅選擇元素節點,或者
  2. 循環返回的五個節點,僅選擇非文本節點。

您可以執行以下操作:

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

您可以使用節點類型僅選擇元素節點,或刪除文本節點。

所以xpath看起來像: /config/a/b/*/text() 和輸出為:

for (int i = 0; i < nodes.getLength(); i++) {
        System.out.println(nodes.item(i).getNodeValue());
    }

符合預期:p1和p2

怎么樣

/config/a/b/*/text()/..

import org.w3c.dom.*;

import javax.xml.xpath.*;

import javax.xml.parsers.*;

import java.io.IOException;

import org.xml.sax.SAXException;

public class TestClient_XPath {

    public static void main(String[] args) throws ParserConfigurationException,
            SAXException, IOException, XPathExpressionException {

        DocumentBuilderFactory domFactory = DocumentBuilderFactory
                .newInstance();
        domFactory.setNamespaceAware(true);
        DocumentBuilder builder = domFactory.newDocumentBuilder();

        Document doc = builder.parse("yourfile.xml");
        XPath xpath = XPathFactory.newInstance().newXPath();

        XPathExpression xPathExpression = xpath.compile("/a/b/c");

        Object res = xPathExpression.evaluate(doc);

        System.out.println(res.toString());
    }

}

Xalan和Xerces似乎嵌入在rt.jar中。

不要包括xerces和xalan庫。

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4624775

我不確定,但/ config / a / b不應該只返回b嗎? / config / a / b / param應該返回兩個param節點...

對問題的看法可能是問題嗎? 當然,您會得到結果節點及其所有子節點。 因此,您只需要查看第一個元素,而不是其子元素。

但是我可能完全錯了,因為我通常只是使用Xpath在DOM樹(HtmlUnit)上導航。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM