如何实现XML文档和JTree之间转换

xml因为良好的结构,被广泛地应用于文档格式的定义。我们知道,应用软件一般需要用配置文件来决定运行时的一些参数。以前的应用程序的配置文件一般是一个.ini文件。虽然现在,ini文件仍然在使用,但是由于xml的出现,越来越多的商用软件正在把xml当作配置文件的格式,如bea的weblogic,以及ibm的websphere等。所以,当我们设计一个软件的配置文件时,将会越来越多地考虑使用xml作为该配置文件的格式。

而因为配置文件有时候必须让用户修改,所以提供一个可视化的编辑配置文件的格式,是一个软件具有良好的用户可交互性的体现。我们必须给XML文档找到一个可视化的方法。Java语言中的Swing组件里面的JTree,用于XML文档的可视化是非常适合的。这两者之间存在着很方便的转换方法。这就意味着我们能将用户在JTree上面的操作,在存盘后方便地表现为在XML文件中的修改,也能将XML文件方便地表现为一棵JTree展现给用户。

XML文档的可视化

一个XML文档其实是一个树形的结构。比如下面这个XML文档:

      古典    d:softwareAppskin    head1.bmp    center1.bmp    foot1.bmp      现代    d:softwareAppskin    head2.bmp    center2.bmp    foot2.bmp  

登录后复制

可以看得出来,该XML文档是一个多界面程序的界面图片配置程序,如果将该XML文档可视化,那么使用JTree的话应该得到的是如下图所示的结果。

如何实现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  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()+“”); //如果是叶子节点则直接将该节点输出到文件中     else { //不是叶子节点的话递归输出该节点      fw.write(“”);      for (int i=0; i ”);    }      } catch (Exception e)      {  e.printStackTrace();      } }

登录后复制

必须注意的是,如果XML文件中包含中文,那么需要在调用上面的函数之前,先在文件中输入该XML文件的编码方式,方法如下:

fw.write(“”);

登录后复制

在调用该函数结束后,还应该关闭该文件,方法是:

fw.close()

登录后复制

结论

XML文件广泛地运用于配置文件、信息传递中。它的可视化方法有很多,本文通过结合Java的JTree类,介绍了其中一种实现方法。Java语言和XML的良好结合,让使用Java编制XML程序既灵活又方便。

以上就是如何实现XML文档和JTree之间转换的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2417550.html

(0)
上一篇 2025年3月3日 01:54:21
下一篇 2025年2月26日 20:50:47

AD推荐 黄金广告位招租... 更多推荐

发表回复

登录后才能评论