XML(Extensible Markup Language)について
XML(Extensible Markup Language)とは、任意の用途向けにデータ構造をシンプルに表現したマークアップ言語のことです。
マークアップ言語とは、タグと値のセットで構成され、文章を構造化する言語をいいます。
例えば、Webサイト作成で使われる HTML言語 が有名どころのマークアップ言語ですね。
HTMLがWebサイトの情報を記述するる言語に対し、XMLはデータ交換のための汎用のデータ形式となっています。
- インターネット上での使いやすさ
- 広くさまざまなアプリケーションをサポート
- XML文書を処理するプログラムを簡単に記述可能
- オプション機能を可能な限りゼロに
- 規則に従っており簡潔である
- 読みやすくて分かりやすい
- すぐに作成可能
これらの特徴があるのがXMLです。
また、XMLで書かれた文書のことを「XMLドキュメント」と言います。
XMLドキュメントは、タグと値のセットで文書を記述していきます。
文書の記述ルールは下記の通りです。
<要素名 属性=”値”>内容</要素名>
要素名のタグ <要素名> を用意し、この中に内容・値を記述します。
要素名には属性も付けられるようになっています。
そして、 </要素名> で要素タグを閉じます。
JavaでXMLを出力する方法
ここでは、JavaでXMLファイルを出力する方法を見ていきましょう。
サンプルコードは下記の通りです。
■記述例 import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; public class WriteXML { public static void main(String[] args) { DocumentBuilder builder = null; try { builder = DocumentBuilderFactory.newInstance() .newDocumentBuilder(); } catch (ParserConfigurationException e) { e.printStackTrace(); } Document doc = builder.newDocument(); Element info = doc.createElement("info"); doc.appendChild(info); Element name01 = doc.createElement("name"); name01.setAttribute("id", "P001"); name01.appendChild(doc.createTextNode("Potepan Style")); info.appendChild(name01); Element name02 = doc.createElement("name"); name02.setAttribute("id", "P002"); name02.appendChild(doc.createTextNode("Potepan Tarou")); info.appendChild(name02); File file = new File("Sample.xml"); writexml(file, doc); } public static boolean writexml(File file, Document doc) { Transformer tf = null; try { TransformerFactory factory = TransformerFactory .newInstance(); tf = factory.newTransformer(); } catch (TransformerConfigurationException e) { e.printStackTrace(); return false; } tf.setOutputProperty("indent", "yes"); tf.setOutputProperty("encoding", "UTF-8"); try { tf.transform(new DOMSource(doc), new StreamResult( file)); } catch (TransformerException e) { e.printStackTrace(); return false; } return true; } }
サンプルコードの内容を簡単に見ていきましょう。
DocumentBuilder builder = null; try { builder = DocumentBuilderFactory.newInstance() .newDocumentBuilder(); } catch (ParserConfigurationException e) { e.printStackTrace(); } Document doc = builder.newDocument();
上記の部分で、Documentインスタンスの作成を行っています。
DocumentBuilderクラスは、XML文書からDOM(Document Object Model)のDocumentインスタンスを取得するAPIです。
DOMというのは、XML文書にアクセスするためのオブジェクトモデルとその標準インタフェースに関する規格ですね。
要素がノードで表現され、ノードの関係がノードツリーで表現されます。
DocumentBuilder.newDocumentメソッドを利用し、DOMオブジェクトの新しいインスタンスを doc として保持しています。
Element info = doc.createElement("info"); doc.appendChild(info); Element name01 = doc.createElement("name"); name01.setAttribute("id", "P001"); name01.appendChild(doc.createTextNode("Potepan Style")); info.appendChild(name01); Element name02 = doc.createElement("name"); name02.setAttribute("id", "P002"); name02.appendChild(doc.createTextNode("Potepan Tarou")); info.appendChild(name02); File file = new File("Sample.xml"); writexml(file, doc);
documentメソッドを使って、要素や属性を作成しました。
それぞれのメソッドは、次のような役割を果たしています。
- createElement:要素を作成する
- appendChild:子要素を追加する
- setAttribute:属性名とその値を設定する
- createText:要素内容を作成する
public static boolean writexml(File file, Document doc) { Transformer tf = null; try { TransformerFactory factory = TransformerFactory.newInstance(); tf = factory.newTransformer(); } catch (TransformerConfigurationException e) { e.printStackTrace(); return false; } tf.setOutputProperty("indent", "yes"); tf.setOutputProperty("encoding", "UTF-8"); try { tf.transform(new DOMSource(doc), new StreamResult(file)); } catch (TransformerException e) { e.printStackTrace(); return false; } return true; }
最後に、writexml関数でXMLファイルの作成・出力をしています。
Transformerは、ソースコードの記述内容を結果ツリーへ変換処理しています。
Transformerインスタンスを生成し、改行指定やエンコーディングの設定をした上で、trasformメソッドでXMLファイルを作成する流れです。
上記のサンプルプログラムを実行すると、同ディレクトリにSample.xmlが出力されます。
中身を確認すると、下記のように記述されているはずです。
■実行結果 <?xml version="1.0" encoding="UTF-8" standalone="no"?> <info> <name id="P001">Potepan Style</name> <name id="P002">Potepan Tarou</name> </info>
XMLのインデント出力
JavaでXMLのインデントは下記の部分で設定しています。
tf.setOutputProperty("indent", "yes");
yesにすることでインデントあり、noにすることでなしになります。
先ほどのサンプルではインデントありにしましたので、ここではnoで出力結果を見てみましょう。
次のように記述します。
tf.setOutputProperty("indent", "no");
実行結果は下記の通り、全てが1文で出力されます。
■実行結果 <?xml version="1.0" encoding="UTF-8" standalone="no"?><info><name id="P001">Potepan Style</name><name id="P002">Potepan Tarou</name></info>
XML出力の文字コード指定
文字コードの出力は下記の部分で設定しています。
tf.setOutputProperty("encoding", "UTF-8");
今回は「UTF-8」にしていますが、他にも「Shift-JIS」など文字コードは変更可能です。
文字コードを指定する場合は、第二引数に好きな文字コードを指定しましょう。