【问题标题】:getChildNodes giving unexpected resultgetChildNodes 给出意外结果
【发布时间】:2011-12-19 08:25:47
【问题描述】:

我的 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

我的问题是为什么“# of chidren are”分别是 5 和 3?我不应该分别期待 2 和 1 吗? 因为第一个对象有“variable_value”和“reference”,而第二个对象只有“reference

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

【问题讨论】:

    标签: java xml dom xml-parsing sax


    【解决方案1】:

    确保 子节点之间没有空格。空格被视为子节点并按原样返回。

    测试是否

    childNode.getNodeType() == Node.ELEMENT_NODE
    

    应该够了。

    【讨论】:

      【解决方案2】:

      那是因为每个子节点之间有 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

      【讨论】:

        【解决方案3】:

        您只计算 ELEMENT 节点类型。如果您只对子元素感兴趣,您可以更改代码以包含以下检查

         if (aNode.getNodeType() == Node.ELEMENT_NODE) 
        {
        ...
        }
        

        【讨论】:

          猜你喜欢
          • 2012-01-23
          • 2019-03-06
          • 1970-01-01
          • 2012-10-15
          • 2012-11-07
          • 2019-12-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多