2011-08-27 24 views
0

有人可以解釋爲什麼會發生這種情況;這下面是我已經得到了代碼:Xpath獲取DOM子樹的所有屬性?

String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + 
"<title text=\"title1\">\n" + 
" <comment id=\"comment1\">\n" + 
"  <data> abcd </data>\n" + 
"  <data> efgh </data>\n" + 
" </comment>\n" + 
" <comment id=\"comment2\">\n" + 
"  <data> ijkl </data>\n" + 
"  <data> mnop </data>\n" + 
"  <data> qrst </data>\n" + 
" </comment>\n" + 
"</title>\n"; 

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
Document doc = builder.parse(new InputSource(new StringReader(xml))); 
NodeList nlist = doc.getElementsByTagName("comment"); 

XPathFactory xpf = XPathFactory.newInstance(); 
XPath xp = xpf.newXPath(); 
NodeList nodes = (NodeList)xp.evaluate("//@*", nlist.item(0), XPathConstants.NODESET); 
for(int i = 0; i < nodes.getLength(); i++) 
    System.out.println(nodes.item(i)); 

產生的輸出是:

text="title1" 
id="comment1" 
id="comment2" 

的問題是,我試圖做一個子樹的XPath查詢(即第一所以我只想得到這個子樹的所有屬性,但由於某種原因,無論我通過哪個子樹,它總是返回全部屬性節點,好像對象被傳入xpath評估者是根節點。

我怎樣才能通過並評估所有屬性爲子樹?

回答

2

您必須從XPath表達式中省略//。

NodeList nodes = (NodeList)xp.evaluate("@*", nlist.item(0), XPathConstants.NODESET); 
+0

非常好!你能解釋一下這是如何工作的嗎?! – Larry