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

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

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

Documentノードを作成する

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

ソースコード

1
2
3
4
5
6
7
8
9
10
11
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()を使います。

ソースコード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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

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

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

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

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

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

sample.xml

1
2
3
4
5
  <?xml version="1.0" encoding="UTF-8" ?>
- <members>
  <name>furusin</name>
  <twitterID>@furusin_oriver</twitterID>
  </members>

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

ソースコード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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カードへの保存ができました。