?
快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

闲来麻将官网:银河唯一官网1331:XML文档和JTree之间如何转换?

?

长沙转转麻将必胜口诀 www.fv7j.com.cn 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:softwareAppskin〈/dir〉

〈head〉head1.bmp〈/head〉

〈center〉center1.bm银河唯一官网1331p〈/center〉

〈foot〉foot1.bmp〈/foot〉

〈/skin1〉

〈skin2〉

〈name〉今世〈/name〉

〈dir〉d:softwareAppskin〈/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{

pr银河唯一官网1331ivate 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是一个递归历程银河唯一官网1331,如下:

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);

//轮回处置惩罚每个子节点

i银河唯一官网1331f( 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(“

”) && !data.equals(“

”) &&

data.length() 〉 0 )

{ treeNode.add(new

DefaultMutableTreeNode(node.getNodeValue()));

//假如该节点没有孩子节点,那么直接加到节点下

}

}

}

}

}

}

}

return treeNode; //返回节点 }

应用Java的Swing包里的措施能够很轻易地在JTree上做篡改,可以应用弹出对话框的措施,也可以直接在JTree上篡改。总之,JTree篡改后,必要从新写回文件中去将一棵JTree写成XML文件是一个递归的历程,措施如下:

public void SaveToFile(DefaultMutableTreeNode, FileWriter f银河唯一官网1331w)

{try {

if (root.isLeaf()) fw.write(root.toString()+“

”);

//假如是叶子节点则直接将该节点输出到文件中

else { //不是叶子节点的话递归输出该节点

fw.write(“〈”+root.toString()+“〉

”);

for (int i=0; i 〈 root.getChildCount(); i++)

{ DefaultMutableTreeNode childNode =(DefaultMutableTreeNode)

root.getChildAt(i);

saveFile(childNode, fw);

//递归输出该节点的所有子节点 }

fw.write(“〈/”+root.toString()+“〉

”);

}

} catch (Exception e)

{ e.printStackTrace();

} }

必须留意的是,假如XML文件中包孕中文,那么必要在调用上面的函数之前,先在文件中输入该XML文件的编码要领,措施如下:

fw.write(“〈?xml version=“1.0” encoding=“GB2312”?〉

”);

在调用该函数停止后,还应该关闭该文件,措施是:

fw.close()

摘自:赛迪网   光阴:2003年9月9日

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: