2013-07-14 57 views
2

我想獲得Java中的XML元素的兄弟姐妹。我如何獲得Java中的XML元素的兄弟姐妹(使用DOM解析器)?

的xml文件如下:

<parent> 
    <child1> value 1 </child1> 
    <child2> value 2 </child2> 
    <child3> value 3 </child3> 
    </parent> 

我在Java代碼中使用DOM解析器如下:

package dom_stack; 

import java.io.File; 
import java.io.IOException; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 
import org.w3c.dom.Document; 
import org.w3c.dom.NodeList; 
import org.xml.sax.SAXException; 


public class DOM_stack { 


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


     File file = new File("root.xml"); 
     if (file.exists()){ 
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 

      Document doc; 
      doc = dbf.newDocumentBuilder().parse("root.xml"); 


      NodeList elemNodeList = doc.getElementsByTagName("child1");     

      for(int j=0; j<elemNodeList.getLength(); j++) { 

       System.out.println("The node's value that you are looking now is : " + elemNodeList.item(j).getTextContent()); 
       System.out.println(" Get the Name of the Next Sibling " + elemNodeList.item(j).getNextSibling().getNodeName()); 
       System.out.println(" Get the Value of the Next Sibling " + elemNodeList.item(j).getNextSibling().getNodeValue()); 

      } 


     }//if file exists 
    } 
    } 

不幸的是,結果是:

run: 
    The node's value that you are looking now is : value 1 
    Get the Name of the Next Sibling #text 
    Get the Value of the Next Sibling 

,它應該是:

run: 
    The node's value that you are looking now is : value 1 
    Get the Name of the Next Sibling child2 
    Get the Value of the Next Sibling value2 

那麼,我怎樣才能得到理想的輸出?

感謝,提前

回答

3
<parent> 
    <child1> value 1 </child1> 
    <child2> value 2 </child2> 
    <child3> value 3 </child3> 
</parent> 

什麼你得到的是child1child2元素之間的空白text node

你需要保持走在兄弟姐妹跳過空白,評論等,以獲得下一個element node

Node child1 = elemNodeList.item(j); 
Node sibling = child1.getNextSibling(); 
while (!(sibling instanceof Element) && sibling != null) { 
    sibling = sibling.getNextSibling(); 
} 
System.out 
     .println(" Get the Name of the Next Sibling " + sibling.getNodeName()); 
System.out 
     .println(" Get the Value of the Next Sibling " + sibling.geTextContent()); 
+0

感謝您的回覆,但我仍然無法打印兄弟姐妹的節點名稱和值與System.out.println.How我可以這樣做嗎? – programmer

+1

元素沒有值 - 請參閱表格[here](http://docs.oracle.com/javase/7/docs/api/org/w3c/dom/Node.html)。 'child2'有一個單獨的孩子,它是一個文本節點。您可以通過調用'sibling.getNodeName()'來獲取節點名稱。你可以通過調用'sibling.getTextContent()'來獲得兄弟的文本內容。 – McDowell

+0

這還沒有爲我着迷,加我的解答作爲答案 – Pali

2

當你調用這一行:

NodeList elemNodeList = doc.getElementsByTagName("child1"); 

您正在收集所有具有名爲「child1」的元素的列表。您期待名稱爲「child2」和「child3」的元素也位於此處。

你可以做的是通過doc.getDocumentElement()得到根Element(這是「父母」)。然後,通過調用rootElement.getChildNodes(),然後遍歷該列表,您可以獲得該文檔的子節點的NodeList

4

或者,您可以使用XPath很容易地做到這一點:

XPath xp = XPathFactory.newInstance().newXPath(); 

    // Select the first child of the root element 
    Element c1 = (Element) xp.evaluate("/parent/*[1]", doc, 
      XPathConstants.NODE); 

    // Select the siblings of the first child 
    NodeList siblings = (NodeList) xp.evaluate("following-sibling::*", c1, 
      XPathConstants.NODESET); 
    for (int i = 0; i < siblings.getLength(); ++i) { 
     System.out.println(siblings.item(i)); 
    } 
+0

xp是什麼意思?因爲我的IDE建議我將創建一個名爲「xp」的新類。謝謝 – programmer

+0

對不起,我錯過了XPath的實例化。請參閱編輯。 –

+0

嗯,我測試了以前的代碼,當我運行該程序時出現異常:例如線程「main」中的異常 javax.xml.transform。TransformerException:無法使用此上下文評估表達式 \t at com.sun.org.apache.xpath.internal.XPath.execute(XPath.java:363) \t at com.sun.org.apache.xpath.internal.jaxp .XPathImpl.eval(XPathImpl.java:204) \t at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(XPathImpl.java:266) \t at dom_stack.DOM_stack.main(DOM_stack.java :64) – programmer

0

由於@McDowell的解決方案沒有爲我工作,我改變了一下,並得到它的工作,所以Node sibling將是「下一個」xml標籤(例如,如果Node current<child1>Node sibling將):

Node sibling = current.getNextSibling(); 
while (null != sibling && sibling.getNodeType() != Node.ELEMENT_NODE) { 
    sibling = sibling.getNextSibling(); 
}