JDOM getchildren() возвращает только один элемент

XML:

<root>
    <foz>
        ....
        <row>
            <column>PD1</column>
            <column>PD2</column>
            <column>PD3</column>
        </row>
        ...
    </foz>
</root>

ДЖАВА:

      FileInputStream fin;  
      fin = new FileInputStream(zip); //zip is a File Object
      ZipInputStream zin = new ZipInputStream(fin);
      ZipEntry ze = null;
      SAXBuilder builder = new SAXBuilder();
        Document document = (Document)builder.build(zin);

        Element rootNode = document.getRootElement();
         List list = rootNode.getChildren("foz");

        for ( int i = 0; i < list.size(); i++ ) {
         Element node = (Element) list.get(i);

         List li = node.getChildren("row");       
         for ( int j = 0; j < li.size(); j++ ){
            Element nodePda = (Element) li.get(j);
            String id = nodePda.getChildTextTrim("column");
            ...
         }
        }
      ...

Я не понимаю, почему предложение "rootNode.getChildren("foz");" возвращает только ОДИН элемент в списке «li», возвращает значения PD1, но не значения PD2 и PD3. Кто-нибудь может мне помочь?

Спасибо заранее!


person user2003559    schedule 23.01.2013    source источник


Ответы (1)


Похоже, что JDOM поступает правильно... В вашем примере является только один дочерний элемент "foz" корневого узла, поэтому rootnode.getChildren("foz") возвращает список из одного элемента.

Затем вы берете этот элемент foz и (успешно) получаете все дочерние элементы "row". Теперь с каждым элементом row вы вызываете метод getChildText("column"). Это всегда будет находить первый дочерний элемент с именем «столбец» и возвращать его текстовое значение, поэтому вы получите только значение «PD1». См. его документацию здесь: getChildText(String) который, в свою очередь, ссылается здесь: getChild(java.lang.String)

Суть в том, что JDOM делает то, что вы просили.

Что вы должны сделать, это:

  • Обновитесь до JDOM 2.x — это поможет при преобразовании значений, оно быстрее, более актуально и лучше поддерживается.
  • Используйте другой цикл внутри элемента строки и вызовите getChildren("column") и получите текст для каждого дочернего элемента "column".

Рольф

person rolfl    schedule 23.01.2013
comment
Ницца! это работает. Спасибо, Рольфл. - person user2003559; 23.01.2013