2009-11-09 47 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