getChildNodes дает неожиданный результат - PullRequest
10 голосов
/ 19 декабря 2011

Мой 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_value" и "reference", а второй объект имеет только "reference"

По сути, я намереваюсь обработать дочерние элементы "объектов".

Ответы [ 3 ]

16 голосов
/ 19 декабря 2011

Убедитесь, что между дочерними узлами нет пробелов.Пробелы считаются дочерними узлами и возвращаются как таковые.

Проверка, достаточно ли

childNode.getNodeType() == Node.ELEMENT_NODE

.

8 голосов
/ 19 декабря 2011

Это потому, что у вас есть 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.

2 голосов
/ 19 декабря 2011

Вы считаете только типы узлов ELEMENT. Вы можете изменить свой код, чтобы включить приведенную ниже проверку, если вас интересуют только дочерние элементы

 if (aNode.getNodeType() == Node.ELEMENT_NODE) 
{
...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...