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

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