jdom可以,如果不清楚XML的结构就按递归做,如果清楚结构可以一层一层取

解决方案 »

  1.   

    /*
     * 创建日期 2005-5-6
     */
    package parsexml;/**
     * @author Larry Zhao
     */
    //DOM树的显示生成代码
    import org.w3c.dom.*; // Core DOM classes
    import org.w3c.dom.traversal.*; // TreeWalker and related DOM classes
    import org.apache.xerces.parsers.*; // Apache Xerces parser classes
    import org.xml.sax.*; // Xerces DOM parser uses some SAX classes
    import javax.swing.*; // Swing classes 
    import javax.swing.tree.*; // TreeModel and related classes
    import javax.swing.event.*; // Tree-related event classes
    import java.io.*; // For reading the input XML filepublic class ParseXML4 implements TreeModel {
    //实现TreeModel的接口
    TreeWalker walker; // 创建TreeWalker的变量 /** 创建TreeWalker模型 */
    public ParseXML4(TreeWalker walker) {
    this.walker = walker;
    } /** 
     * 创建树并返回所有内容
     **/
    public ParseXML4(Document document) {
    DocumentTraversal dt = (DocumentTraversal) document;
    walker = dt
    .createTreeWalker(document, NodeFilter.SHOW_ALL, null, false);
    } /** 
     * 创建树并返回所有元素
     **/
    public ParseXML4(Element element) {
    DocumentTraversal dt = (DocumentTraversal) element.getOwnerDocument();
    walker = dt.createTreeWalker(element, NodeFilter.SHOW_ALL, null, false);
    } // 获取树的根节点
    public Object getRoot() {
    return walker.getRoot();
    } // 判断是否是叶子节点
    public boolean isLeaf(Object node) {
    walker.setCurrentNode((Node) node); // 设置当前节点
    Node child = walker.firstChild(); // 获取第一个子节点
    return (child == null); // 获取不到,子节点返回空
    } //获取孩子节点的数目
    public int getChildCount(Object node) {
    walker.setCurrentNode((Node) node); // 设置当前节点
    // TreeWalker没有孩子节点的计数,自己做循环实现
    int numkids = 0;
    Node child = walker.firstChild(); // 从第一个子节点开始
    while (child != null) { // 循环计算直到子节点为空
    numkids++; // 计数累加
    child = walker.nextSibling(); // 获取下一个子节点
    }
    return numkids; //返回子节点的数目
    } //返回父节点中的子节点
    public Object getChild(Object parent, int index) {
    walker.setCurrentNode((Node) parent); // 设置当前节点
    // TreeWalker提供顺序地访问子节点
    Node child = walker.firstChild();
    while (index-- > 0)
    child = walker.nextSibling();//索引(层数)递减大于0说明还有子节点,继续拿
    return child;
    } //返回子节点在父节点的索引
    public int getIndexOfChild(Object parent, Object child) {
    walker.setCurrentNode((Node) parent); // 设置当前节点
    int index = 0;
    Node c = walker.firstChild(); // 从第一个子节点开始
    while ((c != child) && (c != null)) { // 如果第一个子节点不为空而且下面有子节点,开始循环
    index++;
    c = walker.nextSibling(); // 获取下一个子节点
    }
    return index; // 返回索引(即层数)
    } // 只有在需要编辑树时才修改这个方法,不需要修改接口原有的方法
    public void valueForPathChanged(TreePath path, Object newvalue) {
    } // 树不可编辑,不需要修改接口原有的方法
    public void addTreeModelListener(TreeModelListener l) {
    } public void removeTreeModelListener(TreeModelListener l) {
    } /**
     * Xerces DOM parser, and the creation of a DOM Level 2 TreeWalker object.
     **/
    public static void main(String[] args) throws IOException, SAXException {
    // 使用Xerces parser创建DOM树的实例.
    // 没有使用JAXP API here
    DOMParser parser = new org.apache.xerces.parsers.DOMParser(); //获取XML文件 
    FileReader file = new FileReader("test4.xml");
    Reader in = new BufferedReader(file);
    InputSource input = new org.xml.sax.InputSource(in); //解析文件
    parser.parse(input); //标准的DOM创建document对象
    Document document = parser.getDocument(); // 如果使用DOM Level 2的引用,document对象应该创建DocumentTraversal的对象 
    DocumentTraversal traversal = (DocumentTraversal) document; // 创建节点筛选
    NodeFilter filter = new NodeFilter() {
    public short acceptNode(Node n) {
    if (n.getNodeType() == Node.TEXT_NODE) {
    // Use trim() to strip off leading and trailing space.
    // If nothing is left, then reject the node
    if (((Text) n).getData().trim().length() == 0)
    return NodeFilter.FILTER_REJECT;
    }
    return NodeFilter.FILTER_ACCEPT;
    }
    }; // 显示所有节点但是不包含注释
    int whatToShow = NodeFilter.SHOW_ALL & ~NodeFilter.SHOW_COMMENT; //创建基于上述筛选方法的树结构
    TreeWalker walker = traversal.createTreeWalker(document, whatToShow,
    filter, false); // 初始化数模型并显示
    JTree tree = new JTree(new ParseXML4(walker)); // 显示窗口
    JFrame frame = new JFrame("XML文件树状生成");
    frame.getContentPane().add(new JScrollPane(tree));
    frame.setSize(500, 250);
    frame.setVisible(true);
    }
    }