2013-06-24 43 views
4

有一個XML文檔:Java的DOM:如何得到我有多少子元素

<entities xmlns="urn:yahoo:cap"> 
    <entity score="0.988"> 
     <text end="4" endchar="4" start="0" startchar="0">Messi</text> 
     <wiki_url>http://en.wikipedia.com/wiki/Lionel_Messi</wiki_url> 
     <types> 
      <type region="us">/person</type> 
     </types> 
    </entity> 
</entities> 

我有一個TreeMap<String,String> data存儲的getTextContent()同時爲"text""wiki_url"元素。有些"entity"只會有"text"元素(不是"wiki_url"),所以我需要一種方法來查明何時只有文本元素作爲子元素,並且存在"wiki_url"。我可以使用document.getElementByTag("text") & document.getElementByTag("wiki_url")但我會失去文字和網址之間的關係。

我試圖通過使用獲得"entity"元素中量元素:

NodeList entities = document.getElementsByTagName("entity"); //List of all the entity nodes 
int nchild; //Number of children 
System.out.println("Number of entities: "+ entities.getLength()); //Prints 1 as expected 
nchild=entities.item(0).getChildNodes().getLength(); //Returns 7 

然而,由於上面顯示該返回7(這我就不明白了,肯定它的3或4,如果你包括孫子) 然後,我打算使用兒童的數量循環查看是否所有人都檢查getNodeName().equals("wiki_url"),如果正確,將其保存到數據中。

爲什麼當我只能計算3個孩子和1個孫子時,我得到的孩子數爲7?

+3

這聽起來像你只對* element *子節點感興趣......它不同於* all *子節點。 –

+0

每個元素中的文本是否也算作一個孩子?這是唯一的方法我可以得到數字7 – Edd

+1

是的 - 文本節點仍然是節點。最簡單的方法是遍歷子節點並打印出它們的類型... –

回答

3

<entity score="0.988">>後面的空格也計算節點,同樣標籤之間的行尾字符也被解析爲節點。如果您對某個名稱的特定節點感興趣,請添加如下所示的幫助程序方法並隨時隨地撥打電話。

Node getChild(final NodeList list, final String name) 
    { 
     for (int i = 0; i < list.getLength(); i++) 
     { 
      final Node node = list.item(i); 
      if (name.equals(node.getNodeName())) 
      { 
       return node; 
      } 
     } 
     return null; 
    } 

和呼叫

final NodeList childNodes = entities.item(0).getChildNodes(); 
final Node textNode = getChild(childNodes, "text"); 
final Node wikiUrlNode = getChild(childNodes, "wiki_url"); 

通常與DOM工作時,用輔助方法如以上川方以簡化主處理邏輯。

+0

爲了整潔起見,我會讓'getChild'獲取一個Node,而不是NodeList,並在方法內部調用'GetChildNodes()';主叫方無需這樣做的理由。 –

+0

謝謝你修復了一切! – Edd

相關問題