当前位置: 首页 > 面试题库 >

getChildNodes提供意外结果

鲁淇
2023-03-14
问题内容

我的XML看起来像这样-

<collected_objects>
        <object flag="complete" id="objId" version="1">
          <variable_value variable_id="varId">ValueGoesHere</variable_value>
          <reference item_ref="2"/>
        </object>
        <object comment="objComment" flag="complete" id="objId" version="1">
          <reference item_ref="1"/>
        </object>
</collected_objects>

我正在使用以下代码进行处理-

Document dom = parser.getDocument();
    NodeList collected_objects = dom.getElementsByTagName("object");
    System.out.println("Number of collected objects are " + collected_objects.getLength());

        for (int i = 0; i < collected_objects.getLength(); i++) {

            Node aNode = collected_objects.item(i);
            //get children of "objects"         
            NodeList refNodes = aNode.getChildNodes();

            System.out.println("# of chidren are " + refNodes.getLength());

            //print attributes of "objects"

            NamedNodeMap attributes = aNode.getAttributes();
            for (int a = 0; a < attributes.getLength(); a++) {
             Node theAttribute = attributes.item(a);
             System.out.println(theAttribute.getNodeName() + "=" + theAttribute.getNodeValue());

        }

}

它输出为-

Number of collected objects are 2
# of chidren are 5
flag=complete
id=objId
version=1
# of chidren are 3
comment=objComment
flag=complete
id=objId
version=1

我的问题是为什么“孩子数量是”分别为5和3?我不应该分别期望2和1吗?因为第一个对象具有“
variable_valuereference”,第二个对象仅具有“ reference

本质上,我的意图是处理“对象”的子级。


问题答案:

那是因为每个子节点之间有2 TEXT_NODE#text)。

以下内容包括文本节点及其相应的值。

<object flag="complete" id="objId" version="1">
    <TEXT_NODE />
    <variable_value variable_id="varId">ValueGoesHere</variable_value>
    <reference item_ref="2"/>
    <TEXT_NODE />
</object>

可以通过修改代码来验证:

DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document dom = dBuilder.parse(new ByteArrayInputStream(S.getBytes()));
        NodeList collected_objects = dom.getElementsByTagName("object");
        System.out.println("Number of collected objects are "
                + collected_objects.getLength());

        for (int i = 0; i < collected_objects.getLength(); i++) {

            Node aNode = collected_objects.item(i);
            // get children of "objects"
            NodeList refNodes = aNode.getChildNodes();

            System.out.println("# of chidren are " + refNodes.getLength());

            //
            for (int x = 0; x < refNodes.getLength(); x++) {
                Node n = refNodes.item(x);
                System.out.println(n.getNodeType() + " = " + n.getNodeName() + "/" + n.getNodeValue());
            }

            // print attributes of "objects"

            NamedNodeMap attributes = aNode.getAttributes();
            for (int a = 0; a < attributes.getLength(); a++) {
                Node theAttribute = attributes.item(a);
                System.out.println(theAttribute.getNodeName() + "="
                        + theAttribute.getNodeValue());

            }

        }

输出:

Number of collected objects are 2
# of chidren are 5
3 = #text/          
1 = variable_value/null
3 = #text/          
1 = reference/null
3 = #text/        
flag=complete
id=objId
version=1
# of chidren are 3
3 = #text/          
1 = reference/null
3 = #text/        
comment=objComment
flag=complete
id=objId
version=1

其中,3 = TEXT_NODE和1 = ELEMENT_NODE



 类似资料:
  • 我试图对我的Maven Springboot项目执行包,但我看到以下消息。原因会是什么呢?我已经在网上搜索了所有的东西;这是一个常见的情况,但没有人有一个明确的解决办法,可以对我有用。 这次我看到了这个新的错误 真的,问题的原因是没有一个文件夹或包吗?或者这第二行只是与JavaCompilerForce选项本身相关,而与应用程序的核心无关?看来我太奇怪了。而且,在add中,完全相同的应用程序可以在

  • 这就是我如何注册我的应用程序来接收位置更新: 我悬而未决的意图几乎在所要求的时间间隔内被后台调用... 到目前为止还好。 问题:当WIFI被禁用/没有连接到任何网络,或者当没有3G/4G网络数据启用-融合位置提供商没有提供新的位置更新!! 我的位置访问设置打开,并检查GPS卫星和WI-FI和移动网络位置。 更大的问题是:有时在这种情况下,我确实通过挂起的意图接收位置更新回调,但它知道最后的位置(即

  • 问题内容: 给定一个变量,该变量包含巴黎时区的日期时间2000-01-01 00:01(冬季afaik中为UTC + 2): 我希望转换为UTC会导致日期时间为1999-12-31 22:01,但是却得到了: 我想念什么? 谢谢 问题答案: 不幸的是 ,在许多时区使用标准构造函数的参数“不起作用” 。 但是对于没有夏令时转换的时区来说是安全的,例如UTC: 您会注意到: “ LMT + 0:09:

  • 我有以下代码: 为什么它会打印Java流?

  • 我有以下代码,它将标记字符串以创建对象列表: 我预期的输出是 1#、#Jon#、#176 2#、#Jack#、#200 3#、#Jimmy#、#160 如果我把内部分界线更改为类似的东西,它会正常工作为什么会发生这种行为?

  • 在我看来,我的缓冲区包含关于最后一个数据包步骤(路由器->my home)的信息,这些信息解释了为什么TTL值是254以及为什么我用Traceroute找到了相同的两个IP: $>traceroute qwant.com traceroute to qwant.com(194.187.168.99),30跳最大,60字节数据包 172.17.0.1(172.17.0.1)0.026 ms 0.01