[英]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中並未忽略空格。
您有兩種選擇:
您可以執行以下操作:
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庫。
我不確定,但/ config / a / b不應該只返回b嗎? / config / a / b / param應該返回兩個param節點...
對問題的看法可能是問題嗎? 當然,您會得到結果節點及其所有子節點。 因此,您只需要查看第一個元素,而不是其子元素。
但是我可能完全錯了,因為我通常只是使用Xpath在DOM樹(HtmlUnit)上導航。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.