<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 495,comments - 227,trackbacks - 0
    XML因為良好的結(jié)構(gòu),被廣泛地應用于文檔格式的定義。我們知道,應用軟件一般需要用配置文件來決定運行時的一些 參數(shù)。以前的應用程序的配置文件一般是一個.ini文件。雖然現(xiàn)在,ini文件仍然在使用,但是由于XML的出現(xiàn),越來越多的商用軟件正在把XML當作配 置文件的格式,如BEA的Weblogic,以及IBM的Websphere等。所以,當我們設計一個軟件的配置文件時,將會越來越多地考慮使用XML作 為該配置文件的格式。

    而因為配置文件有時候必須讓用戶修改,所以提供一個可視化的編輯配置文件的格式,是一個軟件具有良好的用戶可交互性的體現(xiàn)。我們必須給XML文檔找到一個 可視化的方法。Java語言中的Swing組件里面的JTree,用于XML文檔的可視化是非常適合的。這兩者之間存在著很方便的轉(zhuǎn)換方法。這就意味著我 們能將用戶在JTree上面的操作,在存盤后方便地表現(xiàn)為在XML文件中的修改,也能將XML文件方便地表現(xiàn)為一棵JTree展現(xiàn)給用戶。

    XML文檔的可視化


    一個XML文檔其實是一個樹形的結(jié)構(gòu)。比如下面這個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>


    可以看得出來,該XML文檔是一個多界面程序的界面圖片配置程序,如果將該XML文檔可視化,那么使用JTree的話應該得到的是如下圖所示的結(jié)果。



    圖 可視化結(jié)果


    所有的XML文檔,都能夠生成這樣一個Jtree。使用XML的Parser和Java里的JTree類,可以構(gòu)造出一個通用的可視化XML文檔從而構(gòu)成一棵JTree。XML Parser對XML文檔解析的結(jié)果是生成一顆DOM(Document Object Model)樹,DOM樹的結(jié)構(gòu)和JTree的結(jié)構(gòu)其實是一樣的,這使JTree和XML Parser的配合非常自然。下面就介紹一下做法。

    一個讀寫XML文件的類


    首先必須獲得XML Parser的包,可以從下面的地址獲得:http://xml.apache.org/xerces2-j/index.html

    然后設計一個XMLTree的類,繼承自JTree類的定義和成員變量,函數(shù)定義如下:


    public class XMLTree extends JTree{
    private DefaultMutableTreeNode treeNode; //JTree的根節(jié)點
    private DocumentBuilderFactory dbf;
    // 這三個成員變量是xml parser需要的
    private DocumentBuilder db;
    private Document doc;
    XMLTree(String fileName);
    //構(gòu)造函數(shù),做初始化工作
    public DefaultMutableTreeNode LoadFile(Node root);
    //從某個XML文件生成該樹
    public void SaveToFile(DefaultMutableTreeNode root,FileWriter fw);
    //將該樹存盤成XML文件
    private Node parseXml( String text )
    }


    其中構(gòu)造函數(shù)所做的初始化工作如下:


    XMLTree(String fileName){
    dbf = DocumentBuilderFactory.newInstance();
    //生成dbf的實例
    db = dbf.newDocumentBuilder();
    //生成db的實例
    treeNode = LoadFile( getXMLRoot( text ) );
    //解析該xml文件,返回JTree的根節(jié)點
    setModel( new DefaultTreeModel( treeNode ) );
    //根據(jù)該根節(jié)點生成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;
    //定義要返回的根節(jié)點
    String name = root.getNodeName();
    //獲得該節(jié)點的NodeName
    String value = root.getNodeValue();
    //獲得該節(jié)點的NodeValue
    treeNode = new DefaultMutableTreeNode( root.
    getNodeType() == Node.TEXT_NODE ? value : name );
    //如果為值節(jié)點,那么取得該節(jié)點的值,否則取得該節(jié)點的Tag的名字
    if ( root.hasChildNodes() )
    //如果該節(jié)點有孩子節(jié)點,那么遞歸處理該節(jié)點的孩子節(jié)點
    { NodeList children = root.getChildNodes();
    //取得該節(jié)點的子節(jié)點列表
    if( children != null ){
    //判斷子節(jié)點是否為空
    int numChildren = children.getLength();
    //取得字節(jié)數(shù)目
    for (int i=0; i < numChildren; i++){
    Node node = children.item(i);
    //循環(huán)處理每個子節(jié)點
    if( node != null )
    { if( node.getNodeType() == Node.ELEMENT_NODE )
    { treeNode.add( createTreeNode(node) );
    //如果該子節(jié)點還有孩子節(jié)點使用遞歸的方法處理該子節(jié)點
    } 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é)點沒有孩子節(jié)點,那么直接加到節(jié)點下
    }
    }
    }
    }
    }
    }
    }
    return treeNode; //返回節(jié)點 }


    使用Java的Swing包里的方法能夠很容易地在JTree上做改動,可以使用彈出對話框的方法,也可以直接在JTree上改動。總之,JTree改動后,需要重新寫回文件中去將一棵JTree寫成XML文件是一個遞歸的過程,方法如下:


    public void SaveToFile(DefaultMutableTreeNode, FileWriter fw)
    {try {
    if (root.isLeaf()) fw.write(root.toString()+“\r\n”);
    //如果是葉子節(jié)點則直接將該節(jié)點輸出到文件中
         else { //不是葉子節(jié)點的話遞歸輸出該節(jié)點
    fw.write(“<”+root.toString()+“>\r\n”);
    for (int i=0; i < root.getChildCount(); i++)
    { DefaultMutableTreeNode childNode =(DefaultMutableTreeNode)
    root.getChildAt(i);
    saveFile(childNode, fw);
    //遞歸輸出該節(jié)點的所有子節(jié)點 }
    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é)束后,還應該關(guān)閉該文件,方法是:


    fw.close()


    結(jié)論


    XML文件廣泛地運用于配置文件、信息傳遞中。它的可視化方法有很多,本文通過結(jié)合Java的JTree類,介紹了其中一種實現(xiàn)方法。Java語言和XML的良好結(jié)合,讓使用Java編制XML程序既靈活又方便。
    posted on 2006-04-04 17:08 SIMONE 閱讀(1466) 評論(1)  編輯  收藏 所屬分類: JAVA

    FeedBack:
    # re: 關(guān)于XML文檔和JAVA中的JTree之間如何轉(zhuǎn)換的問題[未登錄]
    2014-08-15 16:15 | Michael
    treeNode = LoadFile( getXMLRoot( text ) );
    這里面的text指的是XML文件里面的內(nèi)容還是文件路徑,
    如果是內(nèi)容,該怎么獲得呢。麻煩盡快告知、  回復  更多評論
      
    主站蜘蛛池模板: 4455永久在线观免费看| 亚洲国产精品日韩在线| 欧洲黑大粗无码免费| a级黄色毛片免费播放视频| 亚洲精品美女久久久久久久| 久久久亚洲裙底偷窥综合| 亚洲精品国产精品乱码不卞| 国产卡一卡二卡三免费入口| 国产成人AV免费观看| 日韩大片免费观看视频播放| 中文字幕亚洲精品无码| 亚洲国产av一区二区三区丶| 亚洲大尺度无码无码专区| 亚洲人成电影网站国产精品| 国产乱子影视频上线免费观看| 成年女人毛片免费播放人| 91热久久免费精品99| 国产婷婷成人久久Av免费高清| 一级特黄录像免费播放中文版| 亚洲欧美日韩一区二区三区在线 | 亚洲一级片免费看| 亚洲精品无AMM毛片| 97久久国产亚洲精品超碰热| 久久亚洲AV成人无码电影| 亚洲人成网站影音先锋播放| 国产亚洲成AV人片在线观黄桃| 337p日本欧洲亚洲大胆裸体艺术| 全部免费毛片在线| 国产成人免费福利网站| 日本一道本高清免费| 国产精品va无码免费麻豆| 国产福利免费观看| 国产在线19禁免费观看| 国产18禁黄网站免费观看| 免费无码一区二区三区蜜桃大| 在线a毛片免费视频观看| 免费看片免费播放| 免费国产不卡午夜福在线| 免费A级毛片无码A| 在线亚洲午夜理论AV大片| 亚洲精品白浆高清久久久久久|