dom 树的后序遍历

发布于 2024-12-14 20:06:08 字数 2148 浏览 2 评论 0原文

如果有一个名为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]

正如大家所看到的,它只遍历了两个标签。我该如何解决这个问题?

If there is an XML file called a.xml, is there any way to traverse its DOM tree in
postorder fashion?

I tried using GetNextSiblings method but it didn't work. Any idea?

Here is the 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>

And here is my code to traverse it:

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

And here is the output:

[comment: null]
[data: null]

As you all can see, it just traverses two tags. How can I fix this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

梦在深巷 2024-12-21 20:06:08

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

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

Here's how your check method should like (I didn't run it though...)

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();  
}
孤凫 2024-12-21 20:06:08

您的 check 函数执行以下操作:

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

因此,您首先检查 title

  • title 的第二个子节点是 comment具有三个 data 子元素的元素。
    • 打印出“comment”,并检查comment节点。
  • 该元素具有三个子节点,第二个子节点是内容为“mnop”的 data 元素。
    • 打印出“data”,并检查data节点。
  • 该元素只有一个子节点,因此检查其下一个同级节点
  • 该元素只有一个子节点,因此尝试检查其下一个同级节点(它没有,因此 null
  • 不执行任何操作,并且返回堆栈。

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

Your check function does this:

  • Given null, do nothing.
  • Given a non-null node with children, take its second child node, print it and check it.
  • If it has fewer than two child nodes, check its next sibling

So, You start by checking title,

  • title's second child is the comment element with three data child elements.
    • Print out "comment", and check the comment node.
  • That element has three child nodes, the second child is the data element with content "mnop".
    • Print out "data", and check the data node.
  • That element only has one child node, so check its next sibling
  • That element only has one child node, so try to check its next sibling (which it doesn't have, therefore null)
  • Do nothing, and return up the stack.

You can fix this by not skipping the first child node every time. You may also wish to loop over the child nodes, recursing the next level each time, rather than using recursion for everything.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文