2週に渡って,JAXBを使用したアンマーシャリング/マーシャリングを解説してきました。とはいうものの,そこで扱ったXMLドキュメントは,すべてファイルでした。

そこで,今週はファイルではない対象を扱ってみましょう。

取りあげるのはStAXとDOMです。もちろん,StAXもDOMもXMLパーサなので,単独でXMLドキュメントを解釈することが可能です。

では,なぜ複数のパースを組み合わせる必要があるのでしょうか。

たとえば,長大なXMLドキュメントの一部しか必要がない場合はどうでしょう。SAXやStAXで必要なところまで読み飛ばし,必要なところだけJAXBでアンマーシャリングします。もちろん,そのままSAXやStAXでパースしてもかまいませんが,スキーマがある場合はJAXBが簡単です。

また,DOMとXPathを組み合わせれば,必要な部分をクエリーすることが簡単にできます。必要な部分が見つかれば,後はJAXBにまかせてしまうというわけです。

このように用途によっては,パースの手段を組み合わせるということも十分意味を持ちます。

では,さっそくJAXBと他のパースを組み合わせてみましょう。

その前に,今週使用するXMLドキュメントを決めておきます。今週は,CDなどの音楽アルバムを表すXMLドキュメントを使用することにしました。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<album xmlns="http://www.javainthebox.net/music">
  <title>Deja Vu</title>
  <credit>Crosby, Stills, Nash & Young</credit>
  <songs>
    <song title="Carry On" writer="Stephen Stills" />
    <song title="Tech Your Children" writer="Graham Nash" />
    <song title="Almost Cut My Hair" writer="David Crosby" />
    <song title="Helpless" writer="Neil Young" />
    <song title="Woodstock" writer="Joni Mitchell" />
    <song title="Deja Vu" writer="David Crosby" />
    <song title="Our House" writer="Graham Nash" />
    <song title="4 + 20" writer="Stephen Stills" />
    <song title="Country Girl" writer="Neil Young" />
    <song title="Everybody I Love You" writer="Stephen Stills, Neil Young" />
  </songs>
</album>

ルートタグが<album>タグで,その中に<title>タグと<credit>タグがあります。そして,曲のデータをまとめる<songs>タグがあります。個々の曲は<song>タグで表されます。

このXMLドキュメントのスキーマをXML Schemaで表すと次のようになります。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0"
    targetNamespace="http://www.javainthebox.net/music" 
    xmlns:tns="http://www.javainthebox.net/music"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
 
  <xs:element name="album">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="tns:title" minOccurs="1"/>
        <xs:element ref="tns:credit" minOccurs="1"/>
        <xs:element ref="tns:songs" minOccurs="1"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
 
  <xs:element name="title" type="xs:string"/>
  <xs:element name="credit" type="xs:string"/>
 
  <xs:element name="songs">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="tns:song" minOccurs="1" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
 
  <xs:element name="song">
    <xs:complexType>
      <xs:attribute name="title" type="xs:string"/>
      <xs:attribute name="writer" type="xs:string"/>
    </xs:complexType>
  </xs:element>
 
</xs:schema>

このようなXMLドキュメントで,JAXBで扱うのは<song>タグとしてみましょう。

他のパースと組み合わせる前に,このスキーマからJavaのクラスを生成しておきます。

C:\jaxb>xjc album.xsd
net\javainthebox\music\Album.java
net\javainthebox\music\ObjectFactory.java
net\javainthebox\music\Song.java
net\javainthebox\music\Songs.java
net\javainthebox\music\package-info.java

これで準備は整いました。

この先は会員の登録が必要です。有料会員(月額プラン)は初月無料!

日経 xTECHには有料記事(有料会員向けまたは定期購読者向け)、無料記事(登録会員向け)、フリー記事(誰でも閲覧可能)があります。有料記事でも、登録会員向け配信期間は登録会員への登録が必要な場合があります。有料会員と登録会員に関するFAQはこちら