D:\>java TreeTest
0 Questions
1 Question
2 Answer
3 Item
4 Item
3 Content
4 Comment你要的是什么样的结果????????

解决方案 »

  1.   

    假设XML文档的根元素是Questions,有两个子元素Queston.....
    ---------------------------------------
    打印结果为:0 根元素 Questions
    1 第一层子元素 Queston
    2 第二层子元素 Answer
    3 第三层子元素 Item 
    3 第三层子元素 Item
    3 第三层子元素 Content
    3 第三层子元素 Comment
    1 第一层子元素 Question
    2 第二层子元素 Answer
    3 第三层子元素 Item 
    3 第三层子元素 Item
    3 第三层子元素 Content
    3 第三层子元素 Comment----------------------------------------------
    明白吗?
      

  2.   

    public void recurse(Element element,int gradeNumber) throws Exception
      {    
        System.out.println(gradeNumber+" "+element.getName());
        
        if (element.hasChildren())
        {
          List list=element.getChildren();
          for (int i=0;i<list.size();i++)
          {
            Element tmp=(Element)list.get(i);
            //recurse(tmp,++gradeNumber); 
            gradeNumber++;
            recurse(tmp,gradeNumber); 
            gradeNumber--;
          }
        }
      }还要你的xml格式需要更改:Comment必须和Item 一样,包含在Answer底下!
    2 第二层子元素 Answer
    3 第三层子元素 Item 
    3 第三层子元素 Item
    3 第三层子元素 Content
    3 第三层子元素 Comment
      

  3.   

    try
    public void recurse(Element element,int gradeNumber) throws Exception
      {    
        System.out.println(gradeNumber+" "+element.getName());
        if (element.hasChildren())
        {
          List list=element.getChildren();
          for (int i=0;i<list.size();i++)
          {
            Element tmp=(Element)list.get(i);
            recurse(tmp,gradeNumber+1); 
          }
        }
      }
      

  4.   

    /*
    刚才改进了一下程序,又发现一个问题,用变量treeDepth无法正确得到XML树的深度,很奇怪
    */
    import org.apache.xerces.parsers.SAXParser;import java.util.*;
    import org.jdom.Document;
    import org.jdom.Element;
    import org.jdom.input.SAXBuilder;
    import org.jdom.output.XMLOutputter;
    public class TreeTest
    {
      /**
       *XML tree depth
       */
      private int treeDepth=0;
      /**
       *Element's grade(层数)
       */
      private int gradeNumber=0;
      /**
       *Save all elements
       */
      private Vector vector=new Vector();  public static void main(String[] args)
      {
        try
        {
          TreeTest t=new TreeTest();
          t.go("D:\\DK\\WorkRoom\\book.xml");
        }
        catch(Exception e)
        {
          e.printStackTrace();
        }
      }
      
      public void go(String path) throws Exception
      {
        /**
         *XML parser
         */
        SAXBuilder saxBuilder=new SAXBuilder("org.apache.xerces.parsers.SAXParser");
        /**
         *JDOM document
         */
        Document jdomDoc=saxBuilder.build(path);    
        /**
         *Root element
         */
        Element rootElement=jdomDoc.getRootElement();
        
        recurse(rootElement,gradeNumber);
        
        viewVector();
        
        System.out.println("XML tree's depth is "+treeDepth);
      } 
      /**
       *Recursion,get all elements
       */
      public void recurse(Element element,int gradeNumber) throws Exception
      {    
        System.out.println(gradeNumber+" "+element.getName());
        // Save this element 
        vector.add(new MyElement(gradeNumber,element));
        
        if (element.hasChildren())
        {
          if (treeDepth<gradeNumber)
          {
            treeDepth=gradeNumber;
            System.out.println("XML tree's depth add 1.");
          }
          List list=element.getChildren();
          for (int i=0;i<list.size();i++)
          {
            Element tmp=(Element)list.get(i);
            recurse(tmp,gradeNumber+1);
          }
        }
      }
      /**
       *Show the vector
       */
      public void viewVector() throws Exception
      {
        System.out.println("This XML document has "+vector.size()+" elements.");    for (int i=0;i<vector.size();i++)
        {
          MyElement tmp=(MyElement)vector.elementAt(i);
          if (tmp.getKey()==3)
          {
            Element tmp2=(Element)tmp.getObject();
            System.out.println(tmp2.getName()+" "+tmp2.getText());
          }
        }
      }
    }
    class TreeElement
    {
      private int key;
      private Object object;
      
      TreeElement(int i,Object o)
      {
        setKey(i);
        setObject(o);
      }
      
      void setKey(int gradeNumber)
      {
        key=gradeNumber;
      }
      
      int getKey()
      {
        return key;
      }
      
      void setObject(Object obj)
      {
        object=obj;
      }
      
      Object getObject()
      {
        return object;
      }
    }
      

  5.   

    public void recurse(Element element,int gradeNumber) throws Exception
      {    
        System.out.println(gradeNumber+" "+element.getName());
        // Save this element 
        vector.add(new MyElement(gradeNumber,element));
        if (treeDepth<gradeNumber)
          {
            treeDepth=gradeNumber;
            System.out.println("XML tree's depth add 1.");
          }
          
        if (element.hasChildren())
        {
          List list=element.getChildren();
          for (int i=0;i<list.size();i++)
          {
            Element tmp=(Element)list.get(i);
            recurse(tmp,gradeNumber+1);
          }
        }
      }
      /**
      

  6.   

    给你一个JTreeOutputter
    /*-- Copyright (C) 2000 Brett McLaughlin & Jason Hunter.
     All rights reserved. Redistribution and use in source and binary forms, with or without
     modification, are permitted provided that the following conditions
     are met: 1. Redistributions of source code must retain the above copyright
        notice, this list of conditions, and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright
        notice, this list of conditions, and the disclaimer that follows
        these conditions in the documentation and/or other materials
        provided with the distribution. 3. The name "JDOM" must not be used to endorse or promote products
        derived from this software without prior written permission.  For
        written permission, please contact [email protected]. 4. Products derived from this software may not be called "JDOM", nor
        may "JDOM" appear in their name, without prior written permission
        from the JDOM Project Management ([email protected]). In addition, we request (but do not require) that you include in the
     end-user documentation provided with the redistribution and/or in the
     software itself an acknowledgement equivalent to the following:
         "This product includes software developed by the
          JDOM Project (http://www.jdom.org/)."
     Alternatively, the acknowledgment may be graphical using the logos
     available at http://www.jdom.org/images/logos. THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
     WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     DISCLAIMED.  IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT
     CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
     USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
     ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
     OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     SUCH DAMAGE. This software consists of voluntary contributions made by many
     individuals on behalf of the JDOM Project and was originally
     created by Brett McLaughlin <[email protected]> and
     Jason Hunter <[email protected]>.  For more information on the
     JDOM Project, please see <http://www.jdom.org/>. */package org.jdom.contrib.output;/**
     * A JTree outputter.
     * <p>
     * This outputter builds a JTree representation of the JDOM document for
     * easy visual navigation.  This is a full rewrite of the JTreeOutputter
     * originally written by James Davies.
     * </p>
     *
     * @author Matthew MacKenzie [[email protected]]
     */
    import java.util.Iterator;
    import java.util.List;
    import javax.swing.*;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.TreeNode;
    import org.jdom.input.SAXBuilder;
    import org.jdom.Document;
    import org.jdom.Attribute;
    import org.jdom.Element;public class JTreeOutputter {    public JTreeOutputter() {
        }    public JTreeOutputter(boolean toBeCompatible) {
            // just here to mimic the legacy JTreeOutputter
        }    /**
         * Output a Document.
         * @param Document The document to transform to TreeNode.
         * @param DefaultMutableTreeNode The root tree node.
         * @return void
         */
        public void output(Document doc, DefaultMutableTreeNode root) {
            processElement(doc.getRootElement(),root);
        }    /**
         * Output an Element.
         * @param Element The element to transform to TreeNode.
         * @param DefaultMutableTreeNode The root tree node.
         * @return void
         */
        public void output(Element el, DefaultMutableTreeNode root) {
            processElement(el, root);
        }    protected void processElement(Element el, DefaultMutableTreeNode dmtn) {
            DefaultMutableTreeNode dmtnLocal =
                new DefaultMutableTreeNode(el.getName());
            String elText = el.getTextTrim();
            if (elText != null && !elText.equals("")) {
                dmtnLocal.add(new DefaultMutableTreeNode(elText));
            }
            processAttributes(el, dmtnLocal);        Iterator iter = el.getChildren().iterator();        while (iter.hasNext()) {
                Element nextEl = (Element)iter.next();
                processElement(nextEl, dmtnLocal);
            }
            dmtn.add(dmtnLocal);
        }    protected void processAttributes(Element el, DefaultMutableTreeNode dmtn) {
            Iterator atts = el.getAttributes().iterator();
            while (atts.hasNext()) {
                Attribute att = (Attribute)atts.next();
                DefaultMutableTreeNode node =
                    new DefaultMutableTreeNode("@" + att.getName());
                node.add(new DefaultMutableTreeNode(att.getValue()));
                dmtn.add(node);
            }
        }
    }