マイナー・マイナー

隠れた名作の発掘が生きがい。

JavaでXML文書を記述しファイルへ書きこむ


スポンサードリンク

XML文書をJavaで読み書きすることが業務で結構ありそうな気配なので,今のうちに予習の意味を込めてそのプログラムを書いてみました.ここではまず,XML文を記述し,それをファイルへと書きこむ処理について書いています.


はじめに,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) {

          // Documentインスタンスの生成
          DocumentBuilder documentBuilder = null;
          try {
               documentBuilder = DocumentBuilderFactory.newInstance()
                         .newDocumentBuilder();
          } catch (ParserConfigurationException e) {
               e.printStackTrace();
          }
          Document document = documentBuilder.newDocument();

          // XML文書の作成
          Element human = document.createElement("human");
          document.appendChild(human);
          Element japanese = document.createElement("japanese");
          japanese.setAttribute("sex", "male");
          japanese.appendChild(document.createTextNode("Taro"));
          human.appendChild(japanese);

          // XMLファイルの作成
          File file = new File("Human.xml");
          write(file, document);
     }

     public static boolean write(File file, Document document) {

          // Transformerインスタンスの生成
          Transformer transformer = null;
          try {
               TransformerFactory transformerFactory = TransformerFactory
                         .newInstance();
               transformer = transformerFactory.newTransformer();
          } catch (TransformerConfigurationException e) {
               e.printStackTrace();
               return false;
          }

          // Transformerの設定
          transformer.setOutputProperty("indent", "yes"); //改行指定
          transformer.setOutputProperty("encoding", "Shift_JIS"); // エンコーディング

          // XMLファイルの作成
          try {
               transformer.transform(new DOMSource(document), new StreamResult(
                         file));
          } catch (TransformerException e) {
               e.printStackTrace();
               return false;
          }

          return true;
     }
}


実行して得られた「Human.xml

<?xml version="1.0" encoding="Shift_JIS"?>
<human>
<japanese sex="male">Taro</japanese>
</human>


メイン処理は大きく3つです.
1.Documentインスタンスの作成
DocumentBuilderは,XML文書からDOM(Document Object Model)のDocumentインスタンスを取得するAPIを提供しています.DOMとはXML文章やHTML文書にアクセスするためのオブジェクトモデルとその標準インタフェースに関する規格だそうです.DocumentBuilder.newDocumentメソッドを利用して,DOMオブジェクトの新しいインスタンスをdocumentとして保持します.


2.XML文書の作成
documentメソッドを利用して,要素や属性を作成します.次のようなメソッドを利用します.
createElement 要素の作成
appendChild 子要素の追加
setAttribute 属性名と属性値の設定
createText 要素内容の作成


3.XMLファイルの作成
JavaでDOMを参照して書きました.Transformerはソースコードを結果ツリーへと変換する処理を提供しています.Transformerインスタンスを生成し,そこに改行指定やエンコーディングの設定をした後,trasformメソッドでXMLファイルを作成しています.


うーん,なんとかXMLを書いていける段階にはなったかな.