posts - 495,comments - 227,trackbacks - 0
          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:\software\App\skin</dir>
          <head>head1.bmp</head>
          <center>center1.bmp</center>
          <foot>foot1.bmp</foot>
          </skin1>
          <skin2>
          <name>現代</name>
          <dir>d:\software\App\skin</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{
          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 < 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(“<”+root.toString()+“>\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程序既靈活又方便。
          posted on 2006-04-04 17:08 SIMONE 閱讀(1471) 評論(1)  編輯  收藏 所屬分類: JAVA

          FeedBack:
          # re: 關于XML文檔和JAVA中的JTree之間如何轉換的問題[未登錄]
          2014-08-15 16:15 | Michael
          treeNode = LoadFile( getXMLRoot( text ) );
          這里面的text指的是XML文件里面的內容還是文件路徑,
          如果是內容,該怎么獲得呢。麻煩盡快告知、  回復  更多評論
            
          主站蜘蛛池模板: 新乡市| 温州市| 宁都县| 兴山县| 昌吉市| 临朐县| 榕江县| 嘉义县| 乌鲁木齐市| 大庆市| 都兰县| 大港区| 怀来县| 石阡县| 屏东市| 宽城| 额尔古纳市| 昌乐县| 开江县| 嘉祥县| 湖口县| 东乡| 紫阳县| 资溪县| 武川县| 日土县| 河南省| 稷山县| 元氏县| 黄山市| 鸡泽县| 喀什市| 监利县| 上高县| 九龙县| 新源县| 乐都县| 黑山县| 武宣县| 开平市| 青神县|