后序遍历dom树

时间:2011-11-12 09:26:33

标签: java dom

如果有一个名为 a.xml 的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 :(得分:0)

您的check函数执行此操作:

  • 如果为null,则不执行任何操作。
  • 给定带子节点的非空节点,取其第二个子节点,打印并检查它。
  • 如果子节点少于两个,请检查其下一个兄弟节点

所以,首先检查title

  • title的第二个孩子是具有三个comment子元素的data元素。
    • 打印出“评论”,然后检查comment节点。
  • 该元素有三个子节点,第二个子节点是内容为“mnop”的data元素。
    • 打印出“数据”,然后检查data节点。
  • 该元素只有一个子节点,因此请检查其下一个兄弟
  • 该元素只有一个子节点,因此请尝试检查其下一个兄弟节点(它没有,因此null
  • 什么也不做,然后回到堆栈。

您可以通过不每次都跳过第一个子节点来解决此问题。您可能还希望遍历子节点,每次递归下一级别,而不是使用递归来处理所有内容。

答案 1 :(得分:0)

这是你的检查方法应该如何(虽然我没有运行它......)

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();  
}