2009-10-16 33 views
2

我有一個XML org.w3c.dom.Document對象。如何獲取Java XML org.w3c.dom.Document的子集?

它看起來有幾分像這樣:

<A> 
    <B> 
    <C/> 
    <D/> 
    <E/> 
    <F/> 
    </B> 
    <G> 
    <H/> 
    <H/> 
    <J/> 
    </G> 
</A> 

我如何轉換文檔對象,以便它剝去根節點並返回另一個Document對象的子集(按名稱選擇),看起來像這樣:

<G> 
    <H/> 
    <H/> 
    <J/> 
</G> 

我希望這樣的事情:

... 
Document doc = db.parse(file); 
Document subdoc = doc.getDocumentSubsetByName("G"); //imaginary method name 
NodeList nodeList = subdoc.getElementsByTagName("H"); 

,但我有找到這樣的事情很麻煩。


答案原來是這樣的:

... 
Document doc = db.parse(); 
doc.getDocumentElement.normalize(); 
NodeList a = doc.getElementsByTagName("A"); 
Element AsubNode = null; 
if (a.item(0) != null) { 
    AsubNode = (Element) a.item(0); 
    nodeList = AsubNode.getElementsByTagName("G"); 
... 
+0

我感覺解決方案與將G節點轉換爲Element對象然後從中獲取nodeList有關。 – djangofan 2009-10-16 23:43:14

回答

0

您可以簡單地使用getElementsByTagName("G")得到G元素,然後選擇其中之一,並呼籲該getElementsByTagName("H")

+0

第一個方法讓我一個NodeList對象,但我想用一個NodeList「結束」。因此,我需要將文檔的子集「之前」轉換爲NodeList。這是困境。 – djangofan 2009-10-16 23:31:39

+0

我不太理解這個問題。從一個NodeList中,你可以得到一個特定的Node,然後你可以將它轉換爲一個Element(如果需要,取決於你的語言),然後調用Element上的getElementsByTagName。 – 2009-10-16 23:50:29

+0

哦,我看到你在使用Java。所以是的,你必須施放。 – 2009-10-16 23:51:06

0

當然,你總是可以使用XPath做同樣的事情:

import javax.xml.xpath.XPath; 
import javax.xml.xpath.XPathConstants; 
import javax.xml.xpath.XPathFactory; 
import org.w3c.dom.NodeList; 

final XPath xpath = XPathFactory.newInstance().newXPath(); 
final NodeList list = (NodeList) xpath.evaluate("/A/G/H", 
    doc.getDocumentElement(), XPathConstants.NODESET); 

這開始還清當路徑到元素開始變得更加複雜(需要屬性謂詞,等等。)

+0

非常感謝你! – djangofan 2009-10-20 17:41:53