アプリを開発していて、アプリ内で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カードへの保存ができました。