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