почтовый перевод дерева дом - PullRequest
1 голос
/ 12 ноября 2011

Если существует XML-файл с именем a.xml , есть ли способ пройти через его дерево DOM по порядку?

Я пытался использовать метод GetNextSiblings но это не сработало.Любая идея?

Вот XML:

<?xml version="1.0" encoding="UTF-8"?> 
       <title text="title1"> 
           <comment id="comment1">
               <data> abcd </data>
               <data> efgh </data>
           </comment>
           <comment id="comment2">
               <data> ijkl </data>
               <data> mnop </data>
               <data> qrst </data>
           </comment>
       </title>

А вот мой код для его обхода:

import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.*;
import org.w3c.dom.traversal.DocumentTraversal;
import org.w3c.dom.traversal.NodeFilter;
import org.w3c.dom.traversal.NodeIterator;
import org.xml.sax.SAXException;

public class Newtraverse {
public static Node check(Node node){
    Node c=node;
    // Node c = null;
    if (node!=null)
        if (node.hasChildNodes()==true &&node.getNodeName()!=null)
        {
            node=node.getFirstChild().getNextSibling();
            if (node!=null)
            {
                 System.out.println(node);

                 check(node); 
            }

            if(node==null)
            {
                c=c.getNextSibling();
                check(c);
            }
       }

    return node;
 }
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
        File file = new File("d:\\a.xml");
  DocumentBuilderFactory dbf =
  DocumentBuilderFactory.newInstance();
  DocumentBuilder db = dbf.newDocumentBuilder();
  Document document = db.parse(file);
  document.getDocumentElement().normalize();


  Node b=document.getFirstChild();

 Node result= check(b);
}
}

А вот вывод:

[comment: null]
[data: null]

Как вы все видите, он просто пересекает два тега.Как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 12 ноября 2011

Вот как должен понравиться ваш метод проверки (хотя я его не запускал ...)

public static void check(Node node){
  if (node == null || node.getNodeName() == null)
    return;

  // Do PostOrder on all children
  check(node.getFirstChild());  

  // Now that all children were traversed, process the current node:
  System.out.println(node); 

  // Do PostOrder on following siblings
  check(node.getNextSibling();  
}
0 голосов
/ 12 ноября 2011

Ваша check функция делает это:

  • Учитывая ноль, ничего не делать.
  • Если задан ненулевой узел с дочерними элементами, возьмите его второй дочерний узел, распечатайте его и проверьте его.
  • Если у него меньше двух дочерних узлов, проверьте его следующего брата

Итак, вы начинаете с проверки title,

  • title является элементом comment с тремя дочерними элементами data.
    • Распечатайте «комментарий» и проверьте узел comment.
  • Этот элемент имеет три дочерних узла, вторым дочерним является элемент data с содержимым "mnop".
    • Распечатайте «данные» и проверьте узел data.
  • У этого элемента есть только один дочерний узел, поэтому проверьте его следующего брата
  • У этого элемента есть только один дочерний узел, поэтому попробуйте проверить его следующего брата (которого у него нет, поэтому null)
  • Ничего не делать и вернуть стек.

Это можно исправить, не пропуская первый дочерний узел каждый раз. Вы также можете захотеть перебрать дочерние узлы, каждый раз возвращаясь к следующему уровню, а не использовать рекурсию для всего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...