使用DOM解析器从XML文档创建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的根节点而没有其他内容。 我尝试使用类似于此的代码遍历目录结构,并且有效。 我不知道为什么这不能给我我期望的结果。

图片

在此处输入图像描述

XML

     John Computer Technology 6 E   Foo Industrial Electronics 6 E   

注意:如果我在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); } }