前端之家收集整理的这篇文章主要介绍了
关于XML文档和JAVA中的JTree之间如何转换的问题,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
XML因为良好的结构,被广泛地应用于文档格式的定义。我们知道,应用软件一般需要用配置文件来决定运行时的一些 参数。以前的应用程序的配置文件一般是一个.ini文件。虽然现在,ini文件仍然在使用,但是由于XML的出现,越来越多的商用软件正在把XML当作配 置文件的格式,如BEA的Weblogic,以及IBM的Websphere等。所以,当我们设计一个软件的配置文件时,将会越来越多地考虑使用XML作 为该配置文件的格式。
而因为配置文件有时候必须让用户修改,所以提供一个可视化的编辑配置文件的格式,是一个软件具有良好的用户可交互性的体现。我们必须给XML文档找到一个 可视化的方法。Java语言中的Swing组件里面的JTree,用于XML文档的可视化是非常适合的。这两者之间存在着很方便的转换方法。这就意味着我 们能将用户在JTree上面的操作,在存盘后方便地表现为在XML文件中的修改,也能将XML文件方便地表现为一棵JTree展现给用户。
XML文档的可视化
一个XML文档其实是一个树形的结构。比如下面这个XML文档:
- <?xml version=“1.0”encoding=“GB2312”?>
- <skin>
- <skin1>
- <name>古典</name>
- <dir>d:\software\App\skin</dir>
- <head>head1.bmp</head>
- <center>center1.bmp</center>
- <foot>foot1.bmp</foot>
- </skin1>
- <skin2>
- <name>现代</name>
- <dir>d:\software\App\skin</dir>
- <head>head2.bmp</head>
- <center>center2.bmp</center>
- <foot>foot2.bmp</foot>
- </skin2>
- </skin>
|
可以看得出来,该XML文档是一个多界面程序的界面
图片配置程序,如果将该XML文档可视化,那么使用JTree的话应该得到的是如下图所示的结果。
图 可视化结果
所有的XML文档,都能够
生成这样一个Jtree。使用XML的Parser和Java里的JTree类,可以构造出一个通用的可视化XML文档从而构成一棵JTree。XML Parser对XML文档解析的结果是
生成一颗DOM(Document Object Model)树,DOM树的结构和JTree的结构其实是一样的,这使JTree和XML Parser的配合非常自然。下面就介绍一下做法。
一个读写XML文件的类
首先必须获得XML Parser的包,可以从下面的地址获得:
http://xml.apache.org/xerces2-j/index.html。
然后设计一个XMLTree的类,继承自JTree类的定义和成员变量,
函数定义如下:
- public class XMLTree extends JTree{
- private DefaultMutableTreeNode treeNode; //JTree的根节点
- private DocumentBuilderFactory dbf;
- // 这三个成员变量是xml parser需要的
- private DocumentBuilder db;
- private Document doc;
- XMLTree(String fileName);
- //构造函数,做初始化工作
- public DefaultMutableTreeNode LoadFile(Node root);
- //从某个XML文件生成该树
- public void SaveToFile(DefaultMutableTreeNode root,FileWriter fw);
- //将该树存盘成XML文件
- private Node parseXml( String text )
- }
|
其中构造
函数所做的初始化工作如下:
- XMLTree(String fileName){
- dbf = DocumentBuilderFactory.newInstance();
- //生成dbf的实例
- db = dbf.newDocumentBuilder();
- //生成db的实例
- treeNode = LoadFile( getXMLRoot( text ) );
- //解析该xml文件,返回JTree的根节点
- setModel( new DefaultTreeModel( treeNode ) );
- //根据该根节点生成JTree
- }
|
其中,parseXml是一个返回XML
文件根元素的程序,如下:
- private Node getXMLRoot( String text ){
- ByteArrayInputStream byteStream;
- byteStream = new ByteArrayInputStream( text.getBytes() );
- //将XML文件读到Stream里去
- try{
- doc = db.parse( byteStream );
- //解析该xml文件。
- } catch ( Exception e )
- { e.printStackTrace();}
- return ( Node )doc.getDocumentElement();
- //返回该XML文件的DOM树的根元素
- }
|
核心部分的LoadFile是一个递归过程,如下:
- private DefaultMutableTreeNode createTreeNode( Node root ){
- DefaultMutableTreeNode treeNode = null;
- //定义要返回的根节点
- String name = root.getNodeName();
- //获得该节点的NodeName
- String value = root.getNodeValue();
- //获得该节点的NodeValue
- treeNode = new DefaultMutableTreeNode( root.
- getNodeType() == Node.TEXT_NODE ? value : name );
- //如果为值节点,那么取得该节点的值,否则取得该节点的Tag的名字
- if ( root.hasChildNodes() )
- //如果该节点有孩子节点,那么递归处理该节点的孩子节点
- { NodeList children = root.getChildNodes();
- //取得该节点的子节点列表
- if( children != null ){
- //判断子节点是否为空
- int numChildren = children.getLength();
- //取得字节数目
- for (int i=0; i < numChildren; i++){
- Node node = children.item(i);
- //循环处理每个子节点
- if( node != null )
- { if( node.getNodeType() == Node.ELEMENT_NODE )
- { treeNode.add( createTreeNode(node) );
- //如果该子节点还有孩子节点使用递归的方法处理该子节点
- } else {
- String data = node.getNodeValue();
- if( data != null )
- {
- data = data.trim();
- if ( !data.equals(“\n”) && !data.equals(“\r\n”) &&
- data.length() > 0 )
- { treeNode.add(new
- DefaultMutableTreeNode(node.getNodeValue()));
- //如果该节点没有孩子节点,那么直接加到节点下
- }
- }
- }
- }
- }
- }
- }
- return treeNode; //返回节点 }
|
使用Java的Swing包里的
方法能够很容易地在JTree上做改动,可以使用弹出对话框的
方法,也可以直接在JTree上改动。总之,JTree改动后,需要重新写回
文件中去将一棵JTree写成XML
文件是一个递归的过程,
方法如下:
- public void SaveToFile(DefaultMutableTreeNode,FileWriter fw)
- {try {
- if (root.isLeaf()) fw.write(root.toString()+“\r\n”);
- //如果是叶子节点则直接将该节点输出到文件中
- else { //不是叶子节点的话递归输出该节点
- fw.write(“<”+root.toString()+“>\r\n”);
- for (int i=0; i < root.getChildCount(); i++)
- { DefaultMutableTreeNode childNode =(DefaultMutableTreeNode)
- root.getChildAt(i);
- saveFile(childNode,fw);
- //递归输出该节点的所有子节点 }
- fw.write(“</”+root.toString()+“>\r\n”);
- }
- } catch (Exception e)
- { e.printStackTrace();
- } }
|
必须注意的是,如果XML
文件中包含
中文,那么需要在
调用上面的
函数之前,先在
文件中输入该XML
文件的编码方式,
方法如下:
- fw.write(“<?xml version=“1.0” encoding=“GB2312”?>\r\n”);
|
在
调用该
函数结束后,还应该
关闭该
文件,
方法是:
结论
XML
文件广泛地运用于
配置文件、信息传递中。它的可视化
方法有很多,本文通过结合Java的JTree类,介绍了其中一种
实现方法。Java语言和XML的良好结合,让使用Java编制XML程序既灵活又方便。