Java getChildNodes给出了意外的结果

Java getChildNodes给出了意外的结果,java,xml,dom,xml-parsing,sax,Java,Xml,Dom,Xml Parsing,Sax,我的XML看起来像这样- <collected_objects> <object flag="complete" id="objId" version="1"> <variable_value variable_id="varId">ValueGoesHere</variable_value> <reference item_ref="2"/> </objec

我的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>
我的问题是为什么“#的孩子是”分别是5岁和3岁?我不应该分别期待2和1吗? 因为第一个对象有“
variable\u value
”和“
reference
”,而第二个对象只有“
reference


本质上,我的目的是处理“对象”的子对象。

确保节点子对象之间没有空格。空格被视为子节点,并作为子节点返回

测试如果

childNode.getNodeType() == Node.ELEMENT_NODE

应该足够了。

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

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

这是因为在每个子节点之间有2个
TEXT\u节点
#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>
其中,3=
TEXT\u节点
和1=
ELEMENT\u节点

 if (aNode.getNodeType() == Node.ELEMENT_NODE) 
{
...
}
<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