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
)。
以下包括文本节点及其对应的值。
这可以通过修改代码来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
。
确保
测试是否
childNode.getNodeType() == Node.ELEMENT_NODE
应该够了。
您只计算ELEMENT节点类型。 如果您只对子元素感兴趣,可以更改代码以包含以下检查
if (aNode.getNodeType() == Node.ELEMENT_NODE) { ... }