java - 使用 DOM 解析器从 XML 文档创建 JTree

标签 java xml swing dom jtree

package xml;

import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.*;
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;

import java.io.*;

public class ThirdParser extends JFrame{
    DocumentBuilderFactory factory;
    DocumentBuilder builder;
    File f;
    Document d;
    JTree tree;
    JScrollPane scroll;
//------------------------------------------------------------------------------
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            @Override public void run(){
                new ThirdParser();
            }
        });
    }
//------------------------------------------------------------------------------
    public ThirdParser(){
        try{

            factory = DocumentBuilderFactory.newInstance();
            builder = factory.newDocumentBuilder();
            f = new File("E:/Website Projects/XML/helloWorld.xml");
            d = builder.parse(f);
            String people = "people";
            DefaultMutableTreeNode node = new DefaultMutableTreeNode(people);
            tree = new JTree(node);
            Element e = d.getDocumentElement();

            if(e.hasChildNodes()){
                DefaultMutableTreeNode root = new DefaultMutableTreeNode
                                                            (e.getTagName());
                NodeList children = e.getChildNodes();
                for(int i=0;i<children.getLength();i++){
                    Node child = children.item(i);
                    visit(child,root);
                }
            }
        }catch(ParserConfigurationException e){
            e.printStackTrace();
        }catch(SAXException e){
            e.printStackTrace();
        }catch(IOException e){
            e.printStackTrace();
        }
//      scroll = new JScrollPane(tree);

        this.add(tree);
        this.setVisible(true);
        this.pack();
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);

    }
//------------------------------------------------------------------------------
    public void visit(Node child,DefaultMutableTreeNode parent){
        short type = child.getNodeType();
        if(type == Node.ELEMENT_NODE){
            Element e = (Element)child;
            DefaultMutableTreeNode node = new DefaultMutableTreeNode
                                        (e.getTagName());
            parent.add(node);

            if(e.hasChildNodes()){
                NodeList list = e.getChildNodes();
                for(int i=0;i<list.getLength();i++){
                    visit(list.item(i),node);
                }
            }

        }else if(type == Node.TEXT_NODE){
            Text t = (Text)child;
            String textContent = t.getTextContent();
            DefaultMutableTreeNode node = new DefaultMutableTreeNode(
                    textContent);
            parent.add(node);
        }
    }
//------------------------------------------------------------------------------
}  

这是我解析 XML 文档并将其表示为 JTree 的代码。问题是我只获得了 JTree 中的根节点,没有别的。我尝试使用与此类似的代码遍历目录结构并且有效。我不知道为什么这没有给我预期的结果。

图片

enter image description here

XML

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE people SYSTEM "validator.dtd">

<people>
    <student>
        <name>John</name>
        <course>Computer Technology</course>
        <semester>6</semester>
        <scheme>E</scheme>
    </student>

    <student>
        <name>Foo</name>
        <course>Industrial Electronics</course>
        <semester>6</semester>
        <scheme>E</scheme>
    </student>
</people>

注意:如果我在 visit() 方法中输入 System.out.println() 来打印元素和文本节点,它会正常打印。只是没有添加节点。

最佳答案

看起来您将子节点添加到错误的父节点。树根设置为 tree = new JTree(node);,但随后您将子节点添加到 DefaultMutableTreeNode root = new DefaultMutableTreeNode(e.getTagName());,这不是树的一部分。快速修复将发生变化:

visit(child,root);

visit(child,node);

或者在访问完所有节点后执行node.add(root);

关于java - 使用 DOM 解析器从 XML 文档创建 JTree,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15964060/

相关文章:

java - 找不到符号/无法使用泛型中的 ArrayList 将对象转换为可比较的对象

java - JSF 2 : How build components correctly?

java - 如何提取 key :value from html

android - 如何解析 Android 布局 xml 文件以创建帮助页面的副本?

Java Swing - 使用 TransferHandler 动态更改 JList

Java多步验证方法——重构

PHP 对象在变量名中有分号(或其他奇怪的字符)

java - 不同按钮的相同 ActionListener - 最佳实践

java - Swing 库中的绘制矩形/填充矩形问题(包括图像)

xml - libcurl SSL证书验证