getChildNodes给出了意想不到的结果

我的XML看起来像这样 –

  ValueGoesHere       

我正在使用以下代码处理它 –

 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_value ”和“ reference ”,第二个对象只有“ reference

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

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

以下包括文本节点及其对应的值。

   ValueGoesHere    

这可以通过修改代码来validation:

 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

确保节点子节点之间没有空格。 空格被视为子节点并以此forms返回。

测试是否

 childNode.getNodeType() == Node.ELEMENT_NODE 

应该够了。

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

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