我有一个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;)开始,我如何找出其他兄弟姐妹的数量?
答案 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;
}