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

銀河唯一官網1331:XML文檔和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: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日

免責聲明:以上內容源自網絡,版權歸原作者所有,如有侵犯您的原創版權請告知,我們將盡快刪除相關內容。

您可能還會對下面的文章感興趣:

快三平台开户