今天小編為大家?guī)?lái)一篇XML文檔和JTree之間轉(zhuǎn)換方法的文章。小編覺(jué)得挺不錯(cuò)的,為此分享給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧。
創(chuàng)新互聯(lián)公司是專(zhuān)業(yè)的谷城網(wǎng)站建設(shè)公司,谷城接單;提供成都網(wǎng)站制作、成都做網(wǎng)站,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行谷城網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
XML因?yàn)榱己玫慕Y(jié)構(gòu),被廣泛地應(yīng)用于文檔格式的定義。我們知道,應(yīng)用軟件一般需要用配置文件來(lái)決定運(yùn)行時(shí)的一些參數(shù)。以前的應(yīng)用程序的配置文件一般是一個(gè).ini文件。雖然現(xiàn)在,ini文件仍然在使用,但是由于XML的出現(xiàn),越來(lái)越多的商用軟件正在把XML當(dāng)作配置文件的格式,如BEA的Weblogic,以及IBM的Websphere等。所以,當(dāng)我們?cè)O(shè)計(jì)一個(gè)軟件的配置文件時(shí),將會(huì)越來(lái)越多地考慮使用XML作為該配置文件的格式。
而因?yàn)榕渲梦募袝r(shí)候必須讓用戶修改,所以提供一個(gè)可視化的編輯配置文件的格式,是一個(gè)軟件具有良好的用戶可交互性的體現(xiàn)。我們必須給XML文檔找到一個(gè)可視化的方法。Java語(yǔ)言中的Swing組件里面的JTree,用于XML文檔的可視化是非常適合的。這兩者之間存在著很方便的轉(zhuǎn)換方法。這就意味著我們能將用戶在JTree上面的操作,在存盤(pán)后方便地表現(xiàn)為在XML文件中的修改,也能將XML文件方便地表現(xiàn)為一棵JTree展現(xiàn)給用戶。
一個(gè)XML文檔其實(shí)是一個(gè)樹(shù)形的結(jié)構(gòu)。比如下面這個(gè)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>現(xiàn)代</name> <dir>d:\software\App\skin</dir> <head>head2.bmp</head> <center>center2.bmp</center> <foot>foot2.bmp</foot> </skin2> </skin>
可以看得出來(lái),該XML文檔是一個(gè)多界面程序的界面圖片配置程序,如果將該XML文檔可視化,那么使用JTree的話應(yīng)該得到的是如下圖所示的結(jié)果。
圖 可視化結(jié)果
所有的XML文檔,都能夠生成這樣一個(gè)Jtree。使用XML的Parser和Java里的JTree類(lèi),可以構(gòu)造出一個(gè)通用的可視化XML文檔從而構(gòu)成一棵JTree。XML Parser對(duì)XML文檔解析的結(jié)果是生成一顆DOM(Document Object Model)樹(shù),DOM樹(shù)的結(jié)構(gòu)和JTree的結(jié)構(gòu)其實(shí)是一樣的,這使JTree和XML Parser的配合非常自然。下面就介紹一下做法。
首先必須獲得XML Parser的包,可以從下面的地址獲得:http://xml.apache.org/xerces2-j/index.html。
然后設(shè)計(jì)一個(gè)XMLTree的類(lèi),繼承自JTree類(lèi)的定義和成員變量,函數(shù)定義如下:
public class XMLTree extends JTree{ private DefaultMutableTreeNode treeNode; //JTree的根節(jié)點(diǎn) private DocumentBuilderFactory dbf; // 這三個(gè)成員變量是xml parser需要的 private DocumentBuilder db; private Document doc; XMLTree(String fileName); //構(gòu)造函數(shù),做初始化工作 public DefaultMutableTreeNode LoadFile(Node root); //從某個(gè)XML文件生成該樹(shù) public void SaveToFile(DefaultMutableTreeNode root,FileWriter fw); //將該樹(shù)存盤(pán)成XML文件 private Node parseXml( String text ) }
其中構(gòu)造函數(shù)所做的初始化工作如下:
XMLTree(String fileName){ dbf = DocumentBuilderFactory.newInstance(); //生成dbf的實(shí)例 db = dbf.newDocumentBuilder(); //生成db的實(shí)例 treeNode = LoadFile( getXMLRoot( text ) ); //解析該xml文件,返回JTree的根節(jié)點(diǎn) setModel( new DefaultTreeModel( treeNode ) ); //根據(jù)該根節(jié)點(diǎn)生成JTree }
其中,parseXml是一個(gè)返回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樹(shù)的根元素 }
核心部分的LoadFile是一個(gè)遞歸過(guò)程,如下:
private DefaultMutableTreeNode createTreeNode( Node root ){ DefaultMutableTreeNode treeNode = null; //定義要返回的根節(jié)點(diǎn) String name = root.getNodeName(); //獲得該節(jié)點(diǎn)的NodeName String value = root.getNodeValue(); //獲得該節(jié)點(diǎn)的NodeValue treeNode = new DefaultMutableTreeNode( root. getNodeType() == Node.TEXT_NODE ? value : name ); //如果為值節(jié)點(diǎn),那么取得該節(jié)點(diǎn)的值,否則取得該節(jié)點(diǎn)的Tag的名字 if ( root.hasChildNodes() ) //如果該節(jié)點(diǎn)有孩子節(jié)點(diǎn),那么遞歸處理該節(jié)點(diǎn)的孩子節(jié)點(diǎn) { NodeList children = root.getChildNodes(); //取得該節(jié)點(diǎn)的子節(jié)點(diǎn)列表 if( children != null ){ //判斷子節(jié)點(diǎn)是否為空 int numChildren = children.getLength(); //取得字節(jié)數(shù)目 for (int i=0; i < numChildren; i++){ Node node = children.item(i); //循環(huán)處理每個(gè)子節(jié)點(diǎn) if( node != null ) { if( node.getNodeType() == Node.ELEMENT_NODE ) { treeNode.add( createTreeNode(node) ); //如果該子節(jié)點(diǎn)還有孩子節(jié)點(diǎn)使用遞歸的方法處理該子節(jié)點(diǎn) } 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())); //如果該節(jié)點(diǎn)沒(méi)有孩子節(jié)點(diǎn),那么直接加到節(jié)點(diǎn)下 } } } } } } } return treeNode; //返回節(jié)點(diǎn) }
使用Java的Swing包里的方法能夠很容易地在JTree上做改動(dòng),可以使用彈出對(duì)話框的方法,也可以直接在JTree上改動(dòng)??傊?,JTree改動(dòng)后,需要重新寫(xiě)回文件中去將一棵JTree寫(xiě)成XML文件是一個(gè)遞歸的過(guò)程,方法如下:
public void SaveToFile(DefaultMutableTreeNode, FileWriter fw) {try { if (root.isLeaf()) fw.write(root.toString()+“\r\n”); //如果是葉子節(jié)點(diǎn)則直接將該節(jié)點(diǎn)輸出到文件中 else { //不是葉子節(jié)點(diǎn)的話遞歸輸出該節(jié)點(diǎn) fw.write(“<”+root.toString()+“>\r\n”); for (int i=0; i < root.getChildCount(); i++) { DefaultMutableTreeNode childNode =(DefaultMutableTreeNode) root.getChildAt(i); saveFile(childNode, fw); //遞歸輸出該節(jié)點(diǎn)的所有子節(jié)點(diǎn) } fw.write(“</”+root.toString()+“>\r\n”); } } catch (Exception e) { e.printStackTrace(); } }
必須注意的是,如果XML文件中包含中文,那么需要在調(diào)用上面的函數(shù)之前,先在文件中輸入該XML文件的編碼方式,方法如下:
fw.write(“<?xml version=“1.0” encoding=“GB2312”?>\r\n”);
在調(diào)用該函數(shù)結(jié)束后,還應(yīng)該關(guān)閉該文件,方法是:
fw.close()
XML文件廣泛地運(yùn)用于配置文件、信息傳遞中。它的可視化方法有很多,本文通過(guò)結(jié)合Java的JTree類(lèi),介紹了其中一種實(shí)現(xiàn)方法。Java語(yǔ)言和XML的良好結(jié)合,讓使用Java編制XML程序既靈活又方便。
以上就是XML文檔和JTree之間轉(zhuǎn)換方法的簡(jiǎn)略介紹,詳細(xì)使用情況還需要大家自己使用過(guò)才領(lǐng)會(huì)。如果想了解更多,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
本文標(biāo)題:XML文檔和JTree之間轉(zhuǎn)換方法
文章轉(zhuǎn)載:http://aaarwkj.com/article20/gjcojo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、Google、自適應(yīng)網(wǎng)站、網(wǎng)站排名、軟件開(kāi)發(fā)、域名注冊(cè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)