2009-11-09 79 views
3

我有一個org.w3c.dom.Node對象。如何檢查節點是否沒有兄弟?

我想看看它是否有任何其他的兄弟姐妹。

這是我曾嘗試:

Node sibling = node.getNextSibling(); 
if(sibling == null) 
    return true; 
else 
    return false; 

然而,出於某種原因(可能是由於源XML identation或行空格),我沒有得到預期的結果。

[此外

node.getParentNode().getChildNodes().getLength() 

是給價值高於我期望更高。]

我歡迎您的建議,以改善該代碼。

編輯

正如以下建議似乎空節點是阻礙我的努力來算的兄弟姐妹。

的XML看起來是這樣的:

<a> 
     <b> 
       <c>I have this node:</c> 
       <c>I want to know how many of these there are.</c> 
       <c>This is another sibling.</c> 
     </b> 
     <b> 
     </b> 

    </a> 

從我的節點開始(第一<Ç> </C以上>),我該如何找出其他兄弟姐妹的數量?

+0

高出多少? – Mark

+0

您可以發佈您的XML的一小段,仍然失敗時使用上面的代碼? –

回答

3

當您從另一個節點獲得子節點時,您會收到所有直接孩子。這將包括元素節點,文本節點和註釋節點。大多數情況下,你只關心元素節點。所以你可以檢查getChildNodes的結果來查看是否有ELEMENT_NODE。

舉一個例子功能你想要做什麼:

public function isSingleChild(Node node) { 
    boolean singleChild = true; 
    NodeList siblings = node.getParentNode().getChildNodes(); 
    for(int i = 0, int len = siblings.getLength(); i < len; i++) { 
     if(siblings.item(i).getNodeType() == Node.ELEMENT_NODE) { 
      singleChild = false; 
      break; 
     } 
    } 

    return singleChild; 
} 

只是爲了看看每個節點類型是這樣的:

<div> 
    <!-- Comment Node --> 
    <p>Element node</p> 
    a text node 
</div> 

獲取DIV節點的childNodes將返回3個節點,包含「註釋節點」的註釋節點,「P」的元素節點以及「文本節點」的文本節點。

2

您可以在過濾掉空白節點之後計算父項目中的子節點數量。 (你可能不想要,但也可能搞亂你的預期結果)。

我不能真正把它放在真正的java中,因爲我對它不夠熟悉,但它應該非常簡單。

+0

什麼是空白節點? – Mark

+1

CDATA或文本節點 –

+1

可能,您關心的唯一節點是ELEMENT_NODE。 – seanmonstar

1

我不是一個Java的傢伙,但在C#中測試一個元素,看它是否有兄弟姐妹的一種方法是使用XPath查詢:

bool hasSiblings = elm.SelectNodes("../*").Count == 1; 

*選擇只找到的元素,這使您不必記住「節點」可以表示元素,文本節點,處理指令或註釋。 (我估計在90%的情況下,當有人談論XML時使用「node」這個詞,他們的意思是「元素」。)

0

感謝大家的意見。

這是我最終使用的代碼,它基於seanmonstar的代碼。

public Boolean isSingleChild(Node node) 
{ 
    int elementNodes = 0; 
    NodeList siblings = node.getParentNode().getChildNodes(); 
    for(int x = 0 ; x < siblings.getLength(); x++) 
    { 
     if(siblings.item(x).getNodeType() == Node.ELEMENT_NODE) 
     { 
      elementNodes++; 
     } 
    } 
    if(elementNodes == 1) 
     return true; 
    else 
     return false; 
} 
+0

oi,當然。我忘了檢查節點是否是原始節點。 – seanmonstar