簡體   English   中英

使用DOM解析器從XML文檔中創建JTree

[英]Creating a JTree out of an XML document using DOM parser

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獲得根節點,而沒有其他東西。 我嘗試使用與此類似的代碼遍歷目錄結構,並且行得通。 我不知道為什么這不能給我期望的結果。

圖片

在此處輸入圖片說明

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); 一旦所有節點都被訪問。

試試這個 ,它應該可以工作:

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.tree.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.*;
import org.xml.sax.SAXException;


/**
 * XmlJTree class
 * @author Ibrabel
 */
public final class XmlJTree extends JTree{

    DefaultTreeModel dtModel=null;

    /**
     * XmlJTree constructor
     * @param filePath
     */
    public XmlJTree(String filePath){
        if(filePath!=null)
        setPath(filePath);
    }

    public void setPath(String filePath){
        Node root = null;
        /*
            Parse the xml file
        */
        try {
            DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse(filePath);
            root = (Node) doc.getDocumentElement();
        } catch (IOException | ParserConfigurationException | SAXException ex) {
            JOptionPane.showMessageDialog(null,"Can't parse file",
                            "Error", JOptionPane.ERROR_MESSAGE);
            return;
        }
        /*
            if any result set the appropriate model to the jTree
        */
        if(root!=null){
            dtModel= new DefaultTreeModel(builtTreeNode(root));
            this.setModel(dtModel);
        }
    }

    /**
     * fullTreeNode Method
     * construct the full jTree from any xml file
     * this method is recursive
     * @param root
     * @return DefaultMutableTreeNode
     */
    private DefaultMutableTreeNode builtTreeNode(Node root){
        DefaultMutableTreeNode dmtNode;

        dmtNode = new DefaultMutableTreeNode(root.getNodeName());
            NodeList nodeList = root.getChildNodes();
            for (int count = 0; count < nodeList.getLength(); count++) {
                Node tempNode = nodeList.item(count);
                // make sure it's element node.
                if (tempNode.getNodeType() == Node.ELEMENT_NODE) {
                    if (tempNode.hasChildNodes()) {
                        // loop again if has child nodes
                        dmtNode.add(builtTreeNode(tempNode));
                    }
                }
            }
        return dmtNode;
    }

    public static void main(String[] args) {
        /*
            Create simple frame for the example
        */
        JFrame myFrame = new JFrame();
        myFrame.setTitle("XmlJTreeExample");
        myFrame.setSize(300, 500);
        myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        myFrame.setLocationRelativeTo(null);
        JPanel pan = new JPanel(new GridLayout(1, 1));
        /*
            Add jTree
        */
        final XmlJTree myTree = new XmlJTree(null);
        myFrame.add(new JScrollPane(myTree));
        /*
            Add a button to choose the file
        */
        JButton button = new JButton("Choose file");
        button.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent ae) {
                JFileChooser chooser = new JFileChooser();
                FileNameExtensionFilter filter = new FileNameExtensionFilter(
                        "XML file", "xml");
                chooser.setFileFilter(filter);
                int returnVal = chooser.showOpenDialog(null);
                if(returnVal == JFileChooser.APPROVE_OPTION) {
                    myTree.setPath(chooser.getSelectedFile().getAbsolutePath());
                }
            }
        });
        pan.add(button);
        /*
            Add the JPanel to the JFrame and set the JFrame visible
        */
        myFrame.add(pan,BorderLayout.SOUTH);
        myFrame.setVisible(true);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM