ホームページ > バックエンド開発 > XML/RSS チュートリアル > XMLドキュメントとJTreeの間で変換する方法

XMLドキュメントとJTreeの間で変換する方法

黄舟
リリース: 2017-05-07 14:08:54
オリジナル
2167 人が閲覧しました

XMLその優れた構造により、文書形式の定義に広く使用されています。アプリケーション ソフトウェアは通常、実行時にいくつかのパラメーターを決定するために設定ファイルを使用する必要があることがわかっています。以前のアプリケーションの構成ファイルは、一般に .ini ファイルでした。 ini ファイルは現在でも使用されていますが、XML の出現により、BEA の Weblogic や IBM の Websphere など、構成ファイル形式として XML を使用する商用ソフトウェアがますます増えています。したがって、ソフトウェア構成ファイルを設計する場合、構成ファイルの形式として 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 ドキュメントでこのような Jtree を生成できます。 XML のパーサーと Java の JTree クラスを使用すると、一般的なビジュアル XML ドキュメントを構築して JTree を形成できます。 XML パーサーが XML ドキュメントを解析した結果、DOM (Document Object Model) ツリーが生成されます。DOM ツリーの構造と JTree の構造は実際には同じであり、これにより JTree と XML が連携します。パーサーは非常に自然です。その方法は次のとおりです。

XML ファイルを読み書きするクラス

は、まず XML パーサー パッケージを取得する必要があります。このパッケージは、アドレス 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 プログラムをコンパイルすることが柔軟かつ便利になります。

以上がXMLドキュメントとJTreeの間で変換する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート