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カードへの保存ができました。