XMLを生成する


アプリを開発していて、アプリ内でXMLを生成し、その情報を利用したアプリを作りたい、ということが出てくると思います。

以前TechBoosterでは、XMLをパース(解析)する方法を解説しました。

今回は、自分でオリジナルのXMLを生成する方法を解説します。

XMLをパース(解析)する方法は、こちらを御覧ください。

それでは続きをどうぞ

DOM

XMLを生成するには、DOM(Document Object Model)を利用します。

DOMとは、HTML文書やXML文書を利用、生成するためのAPIです。

DOMでXML文書を作成するためには、イカのクラスを利用します。

クラス名 用途 リンク
DocumentBuilderFactory アプリケーションで XML ドキュメントから DOM オブジェクトツリーを生成するパーサを取得できるファクトリ API を定義します。   http://bit.ly/n9ei1J 
DocumentBuilder XML ドキュメントから DOM Document インスタンスを取得する API を定義します。このクラスを使用すると、アプリケーションプログラマは XML Document を取得できます。  http://bit.ly/pZ3P4S 
TransformerFactory TransformerFactory インスタンスを使用して、Transformer および Templates オブジェクトを作成することができます。  http://bit.ly/pIjkUb 
Transformer  この abstract クラスのインスタンスは、ソースツリーを結果ツリーに変換することができます。  http://bit.ly/qssQZ0 
Document Document インタフェースは、HTML 文書または XML 文書全体を表します。概念上は文書ツリーのルートであり、文書データに最初にアクセスする手段を提供します。   http://bit.ly/qSB3NV 
Element  Element インタフェースは、HTML 文書または XML 文書内の要素を表します。これらの要素は、自身に関連付けられた属性を持つことができます。  http://bit.ly/qEKxqv 

 まずはDOMを利用してイカのような最も簡単なXMLを生成し、SDカードへ保存してみましょう。

sample.xml

 <?xml version="1.0" encoding="UTF-8" ?> <members />

SDカードへ保存する方法は、過去のTechBoosterの記事「SDカードにファイルを保存する」をご覧ください。

Documentノードを作成する

最初に、XML文書の土台となるDocumentノードとroot要素を作成します。

ソースコード

        DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
        try {
            DocumentBuilder dbuilder = dbfactory.newDocumentBuilder();
            Document document = dbuilder.newDocument(); //Documentノードの生成
            Element root = document.createElement("members");   //root要素の生成
            document.appendChild(root); //root要素をDocumentノードへ追加

        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

4行目でXML文書の土台となるDocumentノードを生成し、5~6行目で”members”という名前のroot要素を追加しています。

SDカードへ保存する

作成したXMLデータを、SDカードへ保存しましょう。

SDカードへ保存する方法は、「SDカードにファイルを保存するでもご紹介したとおり、Environment#getExternalStorageDirectory()を使います。

ソースコード

        DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
        try {
            DocumentBuilder dbuilder = dbfactory.newDocumentBuilder();
            Document document = dbuilder.newDocument();
            Element root = document.createElement("members");
            document.appendChild(root);

            //ここから追記

       TransformerFactory tffactory = TransformerFactory.newInstance();
            Transformer transformer = tffactory.newTransformer();
            String path = Environment.getExternalStorageDirectory().toString() + "/xml/";   //XML保存先ディレクトリ
            File dir = new File(path);
            if(!dir.exists()){
                dir.mkdir();
            }
            File file = new File(path + "sample.xml");
            if(!file.exists()){
                file.createNewFile();
            }
            transformer.transform(new DOMSource(document), new StreamResult(file));
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }catch (TransformerConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (TransformerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        }

12〜13行目でXMLファイルを保存するフォルダを指定し、14〜16行目でフォルダがが存在しなかった場合にFile#mkdirでフォルダを作成しています。

17行目で、生成したdocumentをファイル”sample.xml”として設定し、21行目で出力しています。

以上でアプリを実行すると、SDカード内の”xml”フォルダに”sample.xml”として次の内容のXML文書が生成されます。

sample.xml

 <?xml version="1.0" encoding="UTF-8" ?> <members />

以上で、基本的なXML文書の生成ができました。

要素にテキストを追加する

これまではXMLのノード要素のみを追加してきましたが、XML文書にはテキストが必要ですので、テキストノードを追加しましょう。

今度は、次のようなXML文書を生成します。

sample.xml

  <?xml version="1.0" encoding="UTF-8" ?>
- <members>
  <name>furusin</name>
  <twitterID>@furusin_oriver</twitterID>
  </members>

最初から全てを通して書くと、イカのようになります。

ソースコード

        DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
        try {
            DocumentBuilder dbuilder = dbfactory.newDocumentBuilder();
            Document document = dbuilder.newDocument();
            Element root = document.createElement("members");

            //要素を作成
       Element name = document.createElement("name");
            Text text = document.createTextNode("furusin");
            name.appendChild(text);

            Element twitterID = document.createElement("twitterID");
            text = document.createTextNode("@furusin_oriver");
            twitterID.appendChild(text);

            //各要素を親ノードへ追加
            root.appendChild(name);
            root.appendChild(twitterID);
            document.appendChild(root);


            TransformerFactory tffactory = TransformerFactory.newInstance();
            Transformer transformer = tffactory.newTransformer();
            String path = Environment.getExternalStorageDirectory().toString() + "/xml/";   //XML保存先ディレクトリ
            File dir = new File(path);
            if(!dir.exists()){
                dir.mkdir();
            }
            File file = new File(path + "sample.xml");
            if(!file.exists()){
                file.createNewFile();
            }
            transformer.transform(new DOMSource(document), new StreamResult(file));
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }catch (TransformerConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (TransformerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        }

XML文書は、1つしかroot要素を持つことができません。
そのため、rootノードの下に子要素を追加し、追加した子要素の下に情報を追加していくようにしましょう。

8~15行目で新たに子要素とテキストノードを生成し、17,18行目でroot要素に追加しています。

以上で、情報を持ったXML文書を作成し、SDカードへの保存ができました。