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
これで準備は整いました。