Java Swing How to - Create a JTree out of an XML document using DOM parser








Question

We would like to know how to create a JTree out of an XML document using DOM parser.

Answer

import java.awt.BorderLayout;
import java.awt.GridLayout;
/*from ww w .  jav  a2s .co  m*/
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.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class Main {

  public static void main(String[] args) {
    JFrame f = new JFrame();

    f.setSize(300, 500);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel pan = new JPanel(new GridLayout(1, 1));
    XmlJTree myTree = new XmlJTree(null);
    f.add(new JScrollPane(myTree));
    JButton button = new JButton("Choose file");
    button.addActionListener(e -> {
      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);
    f.add(pan, BorderLayout.SOUTH);
    f.setVisible(true);
  }
}

class XmlJTree extends JTree {

  DefaultTreeModel dtModel = null;

  public XmlJTree(String filePath) {
    if (filePath != null)
      setPath(filePath);
  }

  public void setPath(String filePath) {
    Node root = null;
    try {
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      DocumentBuilder builder = factory.newDocumentBuilder();
      Document doc = builder.parse(filePath);
      root = (Node) doc.getDocumentElement();
    } catch (Exception ex) {
      JOptionPane.showMessageDialog(null, "Can't parse file", "Error",
          JOptionPane.ERROR_MESSAGE);
      return;
    }
    if (root != null) {
      dtModel = new DefaultTreeModel(builtTreeNode(root));
      this.setModel(dtModel);
    }
  }

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

      if (tempNode.getNodeType() == Node.ELEMENT_NODE) {
        if (tempNode.hasChildNodes()) {
          dmtNode.add(builtTreeNode(tempNode));
        }
      }
    }
    return dmtNode;
  }

}