xml tree java_关于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文档:

古典

center1.bmp

foot1.bmp

现代

center2.bmp

foot2.bmp

可以看得出来,该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 ){

ByteArrayInputStreambyteStream;

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(“\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”);

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

fw.close()

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

相关

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

如您喜欢交流学习经验,点击链接加入交流1群:1065694478(已满)交流2群:163560250

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值