【问题标题】:Node.hasChildNodes() returning reverse boolean valuesNode.hasChildNodes() 返回反向布尔值
【发布时间】:2017-06-13 09:44:54
【问题描述】:

我有一个 xml 文档,我正在尝试使用 DOM 解析器进行解析。

    <?xml version="1.0" encoding="utf-8" standalone="no"?>
    <trajectorys version="1.4.1.1">
    <trajectory uid="a" uidWell="b" uidWellbore="c">
       <nameWell>xval</nameWell>
       <nameWellbore>yval</nameWellbore>
       <trajectoryStation uid="0.00">
           <dTimStn>2017-02-04T10:51:20.000-06:00</dTimStn>
           <typeTrajStation>unknown</typeTrajStation>
       </trajectoryStation>
       <commonData>
           <dTimCreation>2017-02-20</dTimCreation>
           <dTimLastChange>2017-02-20</dTimLastChange>
       </commonData>
  </trajectory>
  </trajectorys>

我正在尝试使用 Node.hasChildNodes() 查找子节点。对于 nameWellnameWellbore 节点,它返回 True 即使它没有子节点,而对于 trajectoryStationcommonData 返回 False。 我不明白为什么 hasChildNodes 方法会出现这种相反的行为。

【问题讨论】:

    标签: java xml dom xml-parsing


    【解决方案1】:

    您提到的所有元素节点都有子节点,并且该方法对所有子节点都返回 true。您确定您正在测试正确的节点吗?

    还要注意#hasChildNodes() 包括所有类型的节点、元素、文本、评论等。

    更新:

    只是给你一个想法,这就是我通常在 DOM 文档中收集子元素的方式:

    private List<Element> childElementsOf(Element parent) {
        List<Element> result = new LinkedList<>();
        Node node = parent.getFirstChild();
        while(node != null) {
            if (node.getNodeType() == Node.ELEMENT_NODE) {
                result.add((Element) node);
            }
            node = node.getNextSibling();
        }
        return result;
    }
    

    【讨论】:

    • 好的。我不知道 node 包括所有元素、文本等。但我确信它返回的是反向值。我的要求是检查每个元素节点是否有任何子元素节点。如果有,我需要迭代那些子元素节点。我的意思是子元素作为标签。
    • 实现你的代码后得到相同的结果。输出 xml 文件没有变化
    • 如果您可以分享您的代码,我们将能够更好地提供帮助。
    • if (cNode.hasChildNodes()) { NodeList cnode = cNode.getChildNodes(); for (int j = 0; j
    • 此代码在节点 trajectoryStation 上为上述 xml 返回 false,即使它有两个子节点:dTimStntypeTrajStation
    猜你喜欢
    • 2020-02-26
    • 1970-01-01
    • 2013-08-18
    • 2011-12-14
    • 2020-07-29
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    相关资源
    最近更新 更多