如何检查节点是否没有兄弟姐妹?

时间:2009-11-09 18:50:36

标签: java xml

我有一个org.w3c.dom.Node对象。

我想知道是否还有其他兄弟姐妹。

以下是我的尝试:

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

然而,由于某种原因(可能是由于源XML中的标识或行空间),我没有得到预期的结果。

[另外

 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>

从我的节点(上面的第一个&lt; c&gt;&lt; / c&gt;)开始,我如何找出其他兄弟姐妹的数量?

4 个答案:

答案 0 :(得分:3)

当您从另一个节点获取子节点时,您将收到所有直接子节点。这将包括Element节点,Text节点和Comment节点。大多数情况下,您只关心Element节点。因此,您可以检查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个节点,注释节点包含“Comment Node”,Element节点为“P”,Text节点为“a text node”。

答案 1 :(得分:2)

您可以在过滤掉空白节点后计算子项中的子节点数。 (你可能不想要,但也可能弄乱你的预期结果)。

我不能把它放在实际的java中,因为我对它不够熟悉,但它应该非常简单。

答案 2 :(得分:1)

我不是Java人,但在C#中测试元素以查看它是否有兄弟姐妹的一种方法是使用XPath查询:

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

*选择器只查找元素,这使您不必记住“节点”可以表示元素,文本节点,处理指令或注释。 (我估计在90%的情况下,当有人谈论XML使用“节点”这个词时,他们的意思是“元素”。)

答案 3 :(得分: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;
}