dom4j解析XML文件后,显示问题!

sanegod 2007-08-09 11:22:03
编译了一个用DOM4J解析XML的小程序,并用JTREE显示出来,下面是XML原文件:
<?xml version="1.0" encoding="GB2312"?>
<163com><!--公司部门-->
<department name="RD">
<post name="部门经理">
<name>wangminchu</name>
</post>
<post name="项目负责人">
<name>chenfeng</name>
</post>
<post name="小组成员">
<name>zengzheng</name>
<name>zhangzhipeng</name>
<name>jiangxingzhe</name>
</post>
</department>
</163com>



然后下面是解析XML的程序:

import java.awt.BorderLayout;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.Document;
import org.dom4j.io.SAXReader;
public class XmlTree extends JFrame {

XmlTree(String title) {
super(title);

try
{ SAXReader reader = new SAXReader();
Document doc=reader.read("D:/zznode.xml");
Element root = doc.getRootElement();
DefaultTreeModel model = new DefaultTreeModel(root);
JTree IJTree = new JTree();
IJTree.setModel(model);
getContentPane().add(new JScrollPane(IJTree), BorderLayout.CENTER);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} catch (Exception e) {
System.err.println(e);
}

}
@SuppressWarnings("deprecation")
public static void main(String[] args) {
XmlTree IJTreeDemo = new XmlTree("Display xml file in JTree");
IJTreeDemo.pack();
IJTreeDemo.show();
}
}

class DefaultTreeModel implements TreeModel {
protected Element root;

public DefaultTreeModel(Element root) {
this.root = root;

}

public Object getRoot() {
return (Object) this.root;
}

public boolean isLeaf(Object node) {
if (((Node) node).getNodeType() == 1)
return false;
return true;
}

public int getChildCount(Object parent) {


Element tmpelement=(Element) parent;
return tmpelement.elements().size();
}

public Object getChild(Object parent, int childIndex) {
Element tmpelement=(Element) parent;
Element child = (Element)tmpelement.elements().get(childIndex);
System.out.println(child.getText());
return (Object) child;
}

public int getIndexOfChild(Object parent, Object child) {
Element tmpelement=(Element) parent;
List childs = tmpelement.elements();
if (childs.size() == 0)
return -1;
for (int i = 0; i < childs.size(); i++) {
if (childs.get(i) == child)
return i;
}
return -1;
}

public void valueForPathChanged(TreePath path, Object newValue) {
}

public void addTreeModelListener(TreeModelListener l) {
}

public void removeTreeModelListener(TreeModelListener l) {
}
}


运行起来没有问题,只是,在显示图像界面上,显示不出来XML元素名,如 <name>chenfeng</name>里面的 chenfeng显示不出来,调试时候发现是分步调用的,不知道自己的程序那里出现问题!用不用自己设置一个显示方式呢?怎么去设置?
希望大家帮忙研究研究!谢谢!
...全文
249 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
sanegod 2007-08-09
  • 打赏
  • 举报
回复
姜还是老的辣啊,呵呵!3分钟就帮我解决了!
import java.awt.BorderLayout;
import java.awt.Component;
import java.util.Iterator;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeCellRenderer;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;
import org.dom4j.Attribute;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.Document;
import org.dom4j.io.SAXReader;
import org.dom4j.swing.DocumentTreeModel;
public class XmlTree extends JFrame {

XmlTree(String title) {
super(title);

try
{ SAXReader reader = new SAXReader();
Document doc=reader.read("D:\\zznode.xml");
Element root = doc.getRootElement();
DefaultTreeModel model = new DefaultTreeModel(root);
JTree jTree = new JTree();
jTree.setModel(model);
jTree.setCellRenderer(new XmlTreeCellRenderer());
getContentPane().add(new JScrollPane(jTree), BorderLayout.CENTER);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} catch (Exception e) {
System.err.println(e);
}

}
@SuppressWarnings("deprecation")
public static void main(String[] args) {
XmlTree IJTreeDemo = new XmlTree("Display xml file in JTree");
IJTreeDemo.pack();
IJTreeDemo.show();
}
}

class DefaultTreeModel implements TreeModel {
protected Element root;

public DefaultTreeModel(Element root) {
this.root = root;

}

public Object getRoot() {
return (Object) this.root;
}

public boolean isLeaf(Object node) {
if (((Node) node).getNodeType() == 1)
return false;
return true;
}

public int getChildCount(Object parent) {


Element tmpelement=(Element) parent;
return tmpelement.elements().size();
}

public Object getChild(Object parent, int childIndex) {
Element tmpelement=(Element) parent;
Element child = (Element)tmpelement.elements().get(childIndex);
return (Object) child;
}

public int getIndexOfChild(Object parent, Object child) {
Element tmpelement=(Element) parent;
List childs = tmpelement.elements();
if (childs.size() == 0)
return -1;
for (int i = 0; i < childs.size(); i++) {
if (childs.get(i) == child)
return i;
}
return -1;
}

public void valueForPathChanged(TreePath path, Object newValue) {
}

public void addTreeModelListener(TreeModelListener l) {
}

public void removeTreeModelListener(TreeModelListener l) {
}
}

class XmlTreeCellRenderer extends DefaultTreeCellRenderer{

public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {

Component comp = super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
if(value instanceof Element){
StringBuffer text = new StringBuffer("value:");
text.append(((Element)value).getText());
text.append(" ");
List attrs = ((Element)value).attributes();
if(attrs!=null&&attrs.size()>0){
for(Iterator iter = attrs.iterator();iter.hasNext();){
Attribute attr = (Attribute)iter.next();
text.append(attr.getName());
text.append(":");
text.append(attr.getValue());
if(iter.hasNext())
text.append("--");
}
}
((JLabel)comp).setText(text.toString());
}

return comp;
}

}

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧