【问题标题】:How do I check if a node has no siblings?如何检查节点是否没有兄弟姐妹?
【发布时间】:2009-11-09 18:50:35
【问题描述】:

我有一个 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>

从我的节点开始(上面的第一个),如何找出其他兄弟节点的数量?

【问题讨论】:

  • 您能否发布一个在使用上面的代码时仍然失败的 XML 的小 sn-p?

标签: java xml


【解决方案1】:

当您从另一个节点获取子节点时,您会收到所有直接子节点。这将包括元素节点、文本节点和评论节点。大多数情况下,您只会关心元素节点。所以你可以检查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”的评论节点、一个“P”的 Element 节点和一个“a text node”的 Text 节点。

【讨论】:

    【解决方案2】:

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

    由于我对它不够熟悉,所以我无法将它真正快速地放入实际的 java 中,但它应该非常简单。

    【讨论】:

    • 您关心的唯一节点可能是 ELEMENT_NODE。
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      感谢大家的意见。

      这是我最后使用的代码,它是基于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;
      }
      

      【讨论】:

      • oi,当然。我忘了检查该节点是否是原始节点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      • 1970-01-01
      • 1970-01-01
      • 2019-05-06
      • 2019-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多