JavaオブジェクトをXML形式に変換する実装手法

JavaオブジェクトのXMLシリアライズ技術

システム間データ交換や設定ファイル管理において、JavaオブジェクトをXML形式に変換する処理は基盤技術として重要です。本稿では標準ライブラリを活用した変換手法を解説し、実用的なコード例を提示します。

DOM APIによる構造化出力

ドキュメント全体をメモリ上に構築するDOM方式では、階層構造の明示的な操作が可能です。以下の実装例ではPersonオブジェクトをXMLノードツリーに変換しています。

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = builder.newDocument();

// ルート要素の作成
Element personNode = document.createElement("person");
document.appendChild(personNode);

// 子要素の追加
Element nameNode = document.createElement("name");
nameNode.setTextContent("山田太郎");
personNode.appendChild(nameNode);

Element ageNode = document.createElement("age");
ageNode.setTextContent("32");
personNode.appendChild(ageNode);

// ファイル出力
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(
    new DOMSource(document), 
    new StreamResult(Paths.get("person.xml").toFile())
);

SAXイベント駆動型生成

メモリ効率に優れたSAX方式では、XML出力イベントを直接生成します。XMLWriterユーティリティを活用した実装例を示します。

XMLWriter writer = new XMLWriter(
    new FileWriter("person.xml"), 
    new OutputFormat("XML", "UTF-8", true)
);
writer.startDocument();
writer.startElement("", "person", "person", new AttributesImpl());

writer.startElement("", "name", "name", new AttributesImpl());
writer.characters("山田太郎".toCharArray(), 0, 4);
writer.endElement("", "name", "name");

writer.startElement("", "age", "age", new AttributesImpl());
writer.characters("32".toCharArray(), 0, 2);
writer.endElement("", "age", "age");

writer.endElement("", "person", "person");
writer.endDocument();

JAXBによるアノテーション駆動変換

Javaアーキテクチャ標準であるJAXBでは、クラス定義にアノテーションを付与する宣言的アプローチが可能です。

@XmlRootElement(name = "person")
public class PersonEntity {
    @XmlElement(name = "name")
    private String fullName;
    
    @XmlElement(name = "age")
    private int years;
    
    // デフォルトコンストラクタ必須
    public PersonEntity() {}
    
    // ゲッター/セッター
    public String getFullName() { return fullName; }
    public void setFullName(String name) { fullName = name; }
    public int getYears() { return years; }
    public void setYears(int age) { years = age; }
}

// 変換処理
PersonEntity person = new PersonEntity();
person.setFullName("山田太郎");
person.setYears(32);

JAXBContext context = JAXBContext.newInstance(PersonEntity.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
marshaller.marshal(person, new File("person.xml"));

タグ: JAXB dom SAX Java-XML-Binding

6月12日 16:52 投稿