<?xml version="1.0" encoding="UTF-8" ?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="en">
  <title>豆魂</title>
  <link rel="alternate" type="text/html" href="http://sv20.xserverzero.net/~x2020294/" />
  <modified>2008-11-20T17:09:36+09:00</modified>
    <id>tag:sv20.xserverzero.net,2008://1</id>
      <generator url="http://linux.ohwada.jp/">XOOPS WhatsNew 1.31</generator>
      <copyright>Copyright (c) 2008, Mamezou</copyright>
      <author>
    <name>Mamezou</name>
        <url>http://sv20.xserverzero.net/~x2020294/</url>
          </author>
      <entry>
    <title>Scrum and XP from the Trenches v.2.2　日本語訳</title>
    <link rel="alternate" type="text/html" href="http://mamezou.net/modules/xfsection/article.php?articleid=113" />
    <modified>2008-07-07T15:56:09+09:00</modified>
    <issued>2008-06-30T12:31:58+09:00</issued>
    <id>tag:sv20.xserverzero.net,2008://1.7.113</id>
        <created>2008-06-30T12:31:58+09:00</created>
            <summary type="text/plain">Scrum and XP from the Trenches v.2.2　日本語訳  本文書は、Henrik Kniberg氏による文書、「塹壕よりScrumとXP（Scrum and XP from the Trenches)」を日本語へ訳したものです。  Kniberg氏はスウェーデンのCRISP社に所属する、Javaによる開発やアジャイル方法論の ...</summary>
        <author>
      <name>mameadm</name>
                </author>
        <dc:subject>技術記事</dc:subject>
            <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://sv20.xserverzero.net/~x2020294/">
      <![CDATA[
      <h3>Scrum and XP from the Trenches v.2.2　日本語訳</h3>
<p>本文書は、Henrik Kniberg氏による文書、「塹壕よりScrumとXP（Scrum and XP from the Trenches)」を日本語へ訳したものです。<br/>
Kniberg氏はスウェーデンのCRISP社に所属する、Javaによる開発やアジャイル方法論のコンサルタントです。<br/>
本文書では、Kniberg氏がScrumとXPを組み合わせて組織やプロジェクトへ適用した際の苦労や工夫を見ることができます。特に計画の立て方や見積の実際など、実践が難しい部分を非常に詳しく例示して説明してくれているため、Scrumやアジャイル開発を実践するヒントを求めている方には大きな助けとなるのではないでしょうか。</p>

<p>本文書はもともと社内の一部部署での情報共有のために訳したものでしたが、とても興味深く面白い内容であったため、Kniberg氏の許可を得て公開させて頂きました。<br/>
原文の最新版はInfoQからダウンロードすることができます。訳が杜撰で判りづらい部分もあるかと思いますので、おかしな部分や誤訳などにお気づきの場合は、訳者(<a href="mailto:goto@mamezou.com"><a href="mailto:goto@mamezou.com">goto@mamezou.com</a></a>)までお知らせ頂ければ幸いです。</p>
<p>
(2008/07/07更新）
<ul><li>誤字/脱字を修正しました</li>
<li>オリジナルへのポインタや配布元の情報を加えました</li></ul>
</p>
<p>
◆Scrum and XP from the Trenches v.2.2　日本語訳（PDF)ダウンロード<br/>
<a href="http://mamezou.net/modules/xfsection/downloads/ScrumAndXpFromTrenches.pdf"><a href="http://mamezou.net/modules/xfsection/downloads/ScrumAndXpFromTrenches.pdf" target="_blank">http://mamezou.net/modules/xfsection/downloads/ScrumAndXpFromTrenches.pdf</a></a>
</p>
<p>
◆Henrik Kniberg氏のサイト<br/>
<a href="http://www.crisp.se/henrik.kniberg/"><a href="http://www.crisp.se/henrik.kniberg/" target="_blank">http://www.crisp.se/henrik.kniberg/</a></a>
</p>
<p>
◆InfoQのScrum And XP From The Trenchesのページ<br/>
<a href="http://www.infoq.com/minibooks/scrum-xp-from-the-trenches"><a href="http://www.infoq.com/minibooks/scrum-xp-from-the-trenches" target="_blank">http://www.infoq.com/minibooks/scrum-xp-from-the-trenches</a></a>
</p>

<p>
以下に、特定単語の対訳や意図を示します。
</p>

<table border="1" cellpadding="0" cellspacing="0">
 <tr bgcolor="#DDEEFF">
  <th>原著</th>
  <th>訳</th>
  <th>説明</th>
 </tr>
 <tr>
  <td>acceptance  test</td>
  <td>受け入れテスト</td>
  <td>XPで定義されており、ユーザの検収を目的としたテストで、要件が実現されているかという観点で実施される。</td>
 </tr>
 <tr>
  <td>Actual  Velocity</td>
  <td>実際速度</td>
  <td>スプリントの終了時に確定する、各ストーリーの実装に実際に掛かった作業量。</td>
 </tr>
 <tr>
  <td>available  days</td>
  <td>稼動日数</td>
  <td>直訳では「利用可能日数」だが、対象スプリントで要員がプロジェクトにコミットできる日数を表しているため、「稼動日数」とした。</td>
 </tr>
 <tr>
  <td>backlog  item</td>
  <td>バックログアイテム</td>
  <td>プロジェクトで開発されるシステムに求められる個々の要件。本文書ではストーリーと同義。</td>
 </tr>
 <tr>
  <td>buggy</td>
  <td>バギー</td>
  <td>バグが多く低品質である様子を表す。「バグが多く」とも訳せるが、「バギー」は一般的に使われているため、そのまま残した。</td>
 </tr>
 <tr>
  <td>buzzword</td>
  <td>流行語</td>
  <td>IT業界で度々流行する、明確に定義されていないがキャッチーな単語を指す。商業的、営業的な色が強く、往々にして実効的な内容にならないことを皮肉る意味も込められている。</td>
 </tr>
 <tr>
  <td>daily  scrum</td>
  <td>日次スクラム</td>
  <td>Scrumの要素の一つ。スプリント中に毎日実施されるチームメンバの短時間のミーティングのこと。</td>
 </tr>
 <tr>
  <td>done</td>
  <td>完了</td>
  <td>あるストーリーを実現するために実行されるべきタスクが全て実行され、そのストーリーの作業の終了基準を満たした状態のこと。</td>
 </tr>
 <tr>
  <td>Estimated  Velocity</td>
  <td>見積速度</td>
  <td>スプリントの開始時にチームが見積もった、各ストーリーの実装に掛かるであろう作業量。</td>
 </tr>
 <tr>
  <td>firefighting</td>
  <td>火消し</td>
  <td>主に品質上の問題から、開発対象のソフトウェアに頻発する問題に対応する作業を指す。トラブルの対応を指す言葉として一般的な「火消し」を対応させた。</td>
 </tr>
 <tr>
  <td>first-class  stories</td>
  <td>一人前のストーリー</td>
  <td>first class functionなどと同様の表現だが、ストーリーに対する意味づけとして「一人前の」と訳した。</td>
 </tr>
 <tr>
  <td>focus  factor</td>
  <td>フォーカスファクタ</td>
  <td>理想人日を現実に近づけるため、実際的な観点から理想人実を削減する計算要素を指す。</td>
 </tr>
 <tr>
  <td>planning  porker</td>
  <td>計画ポーカー</td>
  <td>スプリント計画ミーティングと同一方針で訳し、Planningのみ「計画」と訳した。</td>
 </tr>
 <tr>
  <td>Product</td>
  <td>案件</td>
  <td>直訳だと「商品」、「製品」だが、この場合「プロジェクトが開発するあるシステム」「開発プロジェクト」の意味合いとして捉え、「案件」とした。</td>
 </tr>
 <tr>
  <td>Product  Backlog</td>
  <td>プロダクトバックログ</td>
  <td>Scrumの要素の一つ。開発対象のシステムが備えなければならない機能の一覧のこと。プロダクトバックログの内容が個々のバックログアイテム、ストーリーとなる。</td>
 </tr>
 <tr>
  <td>Product  Owner</td>
  <td>プロダクトオーナ</td>
  <td>Scrumのロールの一つ。プロジェクトで開発している対象のオーナ、顧客の立場として要求を提示し、その優先度を決定する役割を果たす。プロダクトバックログのオーナ。</td>
 </tr>
 <tr>
  <td>proposed  team allocation</td>
  <td>チーム割当提案書</td>
  <td>必ずしも書面の形ではないが、ミーティングではこれをメンバが参照しながらチーム割当を決定するため、具体的な割当提案書とした。</td>
 </tr>
 <tr>
  <td>quick-fix</td>
  <td>応急処置</td>
  <td>根本的なものではなく、表層的なやっつけ仕事を意図している。内部的な品質を確保することなく、どんどん適当に作業を進めてしまうもの。</td>
 </tr>
 <tr>
  <td>retrospective</td>
  <td>振り返り</td>
  <td>終わった活動を評価し、教訓を得る活動を指す。「反省」とは異なり、より前向きに今後の改善を念頭に置いた活動。</td>
 </tr>
 <tr>
  <td>Scrum</td>
  <td>Scrum</td>
  <td>開発手法（フレームワーク）としてのScrumの名称を指す。一方、「スクラム」と書いた場合は、毎日実施されるメンバのミーティングである「daily
  scrum」を指す。</td>
 </tr>
 <tr>
  <td>Scrum  mater</td>
  <td>Scrumマスタ</td>
  <td>Scrumにおけるチームリーダを指す。</td>
 </tr>
 <tr>
  <td>Sprint  Backlog</td>
  <td>スプリントバックログ</td>
  <td>プロダクトバックログから、対象のスプリントで実装するストーリーを絞り込んだもの。</td>
 </tr>
 <tr>
  <td>Sprinｔ</td>
  <td>スプリント</td>
  <td>Scrumにおけるライフサイクルの単位。ひとつの反復を指す。イテレーションのこと。</td>
 </tr>
 <tr>
  <td>Sprint  Demo</td>
  <td>スプリントデモ</td>
  <td>Scrumの活動の一つ。対象のスプリントで完成した範囲のシステムを実際に動作させ、プロダクトオーナをはじめ参加者に対してシステムの機能を披露、説明する会。</td>
 </tr>
 <tr>
  <td>Sprint  Planning</td>
  <td>スプリント計画</td>
  <td>対象スプリントの計画。</td>
 </tr>
 <tr>
  <td>Sprint  Planning meeting</td>
  <td>スプリント計画ミーティング</td>
  <td>スプリント計画を作成するミーティング。</td>
 </tr>
 <tr>
  <td>story</td>
  <td>ストーリー</td>
  <td>プロジェクトで開発されるシステムに求められる個々の要件。</td>
 </tr>
 <tr>
  <td>tech  candy</td>
  <td>技術的なお遊び</td>
  <td>プロダクトオーナから見て、開発対象のシステムに対する本質的な価値を持たない、単なる技術者の興味本位な作業を指す。直訳だと「技術的な飴玉」だが、意味が通らないので意訳した。</td>
 </tr>
 <tr>
  <td>Tech  stories</td>
  <td>Techストーリー</td>
  <td>プロダクトオーナにとって直接的な価値が見えないが、作業としては行わなければならないものごと。開発環境の整備など。直訳だと「技術的ストーリー」などだが、座りが悪いので原文に近いTechストーリーとした。</td>
 </tr>
 <tr>
  <td>war  story</td>
  <td>戦争体験談</td>
  <td>直訳では「戦争の物語」、「戦争話」などだが、文書のタイトルに「From
  The Trenches（塹壕より）」とあり、「Here's my war
  story.（僕の戦争の話を聞かせよう）」とあることから、体験した話という意味で「体験談」とした。</td>
 </tr>
 <tr>
  <td>yesterday's  weather</td>
  <td>yesterday's  weather</td>
  <td>直訳では「昨日の天気」だが、文章中に手法を指す固有名詞として登場するため、そのまま残した。</td>
 </tr>
</table>
      ]]>
    </content>
      </entry>
    <entry>
    <title>5/15に豆ナイトを開催します。お題「MOT（Management of Technology：「技術経営」）」</title>
    <link rel="alternate" type="text/html" href="http://mamezou.net/modules/news/article.php?storyid=27" />
    <modified>2008-05-15T13:00:54+09:00</modified>
    <issued>2008-05-15T13:00:54+09:00</issued>
    <id>tag:sv20.xserverzero.net,2008://1.11.2</id>
            <summary type="text/plain">5月15日に豆ナイトを開催します。  今回はMOT（Management of Technology：「技術経営」）について佐々木明博さんに講演をしていただきます。    お申し込み方法や、詳細はこちらから  http://www.mamezou.net/modules/mamenight1/</summary>
        <author>
      <name>Mamezou</name>
                </author>
        <dc:subject>ニュース</dc:subject>
            <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://sv20.xserverzero.net/~x2020294/">
      <![CDATA[
      5月15日に豆ナイトを開催します。
今回はMOT（Management of Technology：「技術経営」）について佐々木明博さんに講演をしていただきます。

お申し込み方法や、詳細はこちらから
http://www.mamezou.net/modules/mamenight1/
      ]]>
    </content>
      </entry>
    <entry>
    <title>4/25に豆ナイトを開催します。お題「Google Android」</title>
    <link rel="alternate" type="text/html" href="http://mamezou.net/modules/news/article.php?storyid=26" />
    <modified>2008-04-14T14:49:56+09:00</modified>
    <issued>2008-04-14T14:49:56+09:00</issued>
    <id>tag:sv20.xserverzero.net,2008://1.11.3</id>
            <summary type="text/plain">4月25日に豆ナイトを開催します。  今回は次世代携帯電話プラットフォームGoogle Androidについて豆蔵有志一同で講演します。    お申し込み方法や、詳細はこちらから  http://www.mamezou.net/modules/mamenight1/</summary>
        <author>
      <name>Mamezou</name>
                </author>
        <dc:subject>ニュース</dc:subject>
            <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://sv20.xserverzero.net/~x2020294/">
      <![CDATA[
      4月25日に豆ナイトを開催します。
今回は次世代携帯電話プラットフォームGoogle Androidについて豆蔵有志一同で講演します。

お申し込み方法や、詳細はこちらから
http://www.mamezou.net/modules/mamenight1/
      ]]>
    </content>
      </entry>
    <entry>
    <title>豆ナイト(怪盗Ruby vs. Scala座の怪人)の開催履歴をアップしました</title>
    <link rel="alternate" type="text/html" href="http://mamezou.net/modules/news/article.php?storyid=25" />
    <modified>2008-03-06T11:30:10+09:00</modified>
    <issued>2008-03-06T11:30:10+09:00</issued>
    <id>tag:sv20.xserverzero.net,2008://1.11.4</id>
            <summary type="text/plain">2/26に開催されました、豆ナイト(怪盗Ruby vs. Scala座の怪人)の開催履歴を更新しました。  http://mamezou.net/modules/mamenight1/index.php?id=16</summary>
        <author>
      <name>Mamezou</name>
                </author>
        <dc:subject>ニュース</dc:subject>
            <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://sv20.xserverzero.net/~x2020294/">
      <![CDATA[
      2/26に開催されました、豆ナイト(怪盗Ruby vs. Scala座の怪人)の開催履歴を更新しました。
http://mamezou.net/modules/mamenight1/index.php?id=16
      ]]>
    </content>
      </entry>
    <entry>
    <title>Google Android完全解説が出版されました。</title>
    <link rel="alternate" type="text/html" href="http://mamezou.net/modules/news/article.php?storyid=24" />
    <modified>2008-03-05T11:12:29+09:00</modified>
    <issued>2008-03-05T11:12:29+09:00</issued>
    <id>tag:sv20.xserverzero.net,2008://1.11.5</id>
            <summary type="text/plain">今話題の携帯電話プラットフォームGoogle Androidの基本から応用までがわかるムック本が発売されました。  詳しくはこちらをご覧ください。  http://www.ascii.co.jp/books/books/detail/978-4-7561-5130-8.shtml</summary>
        <author>
      <name>Mamezou</name>
                </author>
        <dc:subject>ニュース</dc:subject>
            <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://sv20.xserverzero.net/~x2020294/">
      <![CDATA[
      今話題の携帯電話プラットフォームGoogle Androidの基本から応用までがわかるムック本が発売されました。
詳しくはこちらをご覧ください。
http://www.ascii.co.jp/books/books/detail/978-4-7561-5130-8.shtml
      ]]>
    </content>
      </entry>
    <entry>
    <title>JAXB2でXMLデータバインディング(1)</title>
    <link rel="alternate" type="text/html" href="http://mamezou.net/modules/xfsection/article.php?articleid=109" />
    <modified>2008-03-05T10:44:52+09:00</modified>
    <issued>2008-02-28T11:02:41+09:00</issued>
    <id>tag:sv20.xserverzero.net,2008://1.7.109</id>
        <created>2008-02-28T11:02:41+09:00</created>
            <summary type="text/plain">                                                JAXB 2 で XML データバインディング (1)                  株式会社 豆蔵 五味 和人                                                                                    page 1                          &amp;nb ...</summary>
        <author>
      <name>mameadm</name>
                </author>
        <dc:subject>技術記事</dc:subject>
            <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://sv20.xserverzero.net/~x2020294/">
      <![CDATA[
      <table border="0" cellpadding="2" cellspacing="1" width="100%">
    <tbody>
        <tr>
            <td class="xfartcle" width="100%">
                <h1 style="color: rgb(0, 128, 0);">JAXB 2 で XML データバインディング (1)</h1>
                株式会社 豆蔵 五味 和人<br>
                <div>
                <table>
                    <tbody>
                        <tr><td>page 1</td></tr>
                        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=109#Chapter1">1. JAXB とは</a></td></tr>
                        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=109#Chapter2">2. 必要な環境</a></td></tr>
                        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=109#Chapter3">3. 本記事の構成</a></td></tr>
                        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=109#Chapter4">4. とりあえず何も考えずに動かしてみよう</a></td></tr>
                        <tr><td>page 2</td></tr>
                        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=110#Chapter5">5. スキーマ検証をしてみよう</a></td></tr>
                        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=110#Chapter6">6. 繰り返し定義をしてみよう</a></td></tr>
                        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=110#Chapter7">7. 選択定義をしてみよう</a></td></tr>
                        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=110#Chapter8">8. all 定義をしてみよう</a></td></tr>
                        <tr><td>page 3</td></tr>
                        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=111#Chapter9">9. デフォルト値を設定してみよう</a></td></tr>
                        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=111#Chapter10">10. 固定値を設定してみよう</a></td></tr>
                        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=111#Chapter11">11. 名前空間を設定してみよう</a></td></tr>
                        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=111#Chapter12">12. グローバル宣言された要素を参照してみよう</a></td></tr>
                        <tr><td>page 4</td></tr>
                        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=112#Chapter13">13. Ant から schemagen ツールを実行してみよう</a></td></tr>
                        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=112#Chapter14">14. XML スキーマから Java オブジェクトを生成してみよう</a></td></tr>
                        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=112#End">おわりに</a></td></tr>
                    </tbody>
                </table>
                </div>
                <br />

                <h2 style="color: rgb(0, 128, 0);">
1. JAXB とは</h2>
                <p style="margin: 0.5em; text-indent: 1em;">
  JAXB とは、Java Architecture for Xml Binding の略称で、XML データと Java オブジェクトの相互変換を実現するためのテクノロジです。Sun Microsystems 社によって仕様策定・実装がされており、現時点で最新の Java SE 6 Update 4 では、JAXB 2.1 がインプリメントされています。(<a href="http://java.sun.com/javaee/5/docs/tutorial/doc/bnazg.html" target="_blank">Sun Microsystems 社による JAXB のアーキテクチャ説明</a>)</p>
                <p style="margin: 0.5em; text-indent: 1em;">
  旧バージョン (1.x 系) では、XML スキーマからバインディング対象の Java オブジェクトを生成する方法しかありませんでしたが、新バージョン (2.x 系) では、アノテーションの採用により、バインディング対象の Java オブジェクトから XML スキーマを生成することも可能となりました。Java SE 6 からは標準 API (javax.xml.bind.*) となっているため、特別なキットをインストールする必要はありません。</p>
                <p style="margin: 0.5em; text-indent: 1em;">
  旧バージョンでは、XML スキーマから Java オブジェクトを生成すると、膨大な量のクラスが生成されていましたが、新バージョンでは最低限のクラスだけを生成・必要としているため、軽量化、高速化が図られています。</p>

                <h3 style="color: rgb(0, 128, 0);">
1.1. JAXB を使うと何が嬉しい？</h3>
                <p style="margin: 0.5em; text-indent: 1em;">
  さて、JAXB にはいったいどんなメリットがあるのでしょうか。ざっと以下のものがあります。</p>
                <ol><li>
  Java 標準である。<br />
  → Java SE 6 からは JDK に標準機能として搭載されているので、外部プロダクトの使用を嫌う顧客にも導入し易い。</li>
                <li>
  W3C の XML スキーマをフルサポートしている。<br />
  </li>
                <li>
  XML データ構造やデータ値などの、正当性チェックの全て (もしかしたら一部例外あり？) を JAXB に委譲することが出来る。<br />
  → XML スキーマに準拠していないデータを変換しようとすると、JAXB から例外が送出されるので、アプリ側でチェック機構を実装しなくて済む。</li>
                <li>
  独自の XML パーサを実装する必要がない (車輪の再開発が不要)。<br />
  → 実装コスト、テストコストを大きく削減しつつ、高品質を保つことが出来る。</li>
                <li>
  XML データ構造に変更があっても、XML パーサに影響を及ぼさない。<br />
  → XML パーサの改修が不要なので、仕様変更や機能拡張に柔軟に対応出来る。</li>
                </ol>
                <p style="margin: 0.5em; text-indent: 1em;">
  では、JAXB 2 はJAXB 1.x 系と比較してどのような点で利点があるのでしょうか。</p>
                <ol><li>
  実行時に必要なクラス数が劇的に減らされたため、ヒープ領域の軽減が図られた。</li>
                <li>
  JAXP 1.3 の XML スキーマ検証機能に置き換えられた (UnMarshaller#setValidating() メソッドが非推奨 (Deprecated) となった)。</li>
                <li>
  javax.xml.bind.annotation パッケージ内のアノテーションを用いることで、Java オブジェクトから XML スキーマを生成出来るようになった。</li>
                <li>
  XML スキーマに完全準拠したため、より使い易くなり、トリッキーな XML 構造を定義しなくて良くなった。</li>
                <li>
  JDK 標準搭載となったため、JAXP や Xerces のバージョン違いによる競合が起こり難くなり、より簡単にシステムに導入し易くなった。</li>
                </ol>
                <p style="margin: 0.5em; text-indent: 1em;">
  では、概要はこのくらいにして進めて行きましょう。

                <h2 style="color: rgb(0, 128, 0);" id="Chapter2">
2. 必要な環境</h2>
            <div class="emp" style="font-size: smaller; width: 80%;">
                <p style="text-indent: 1em; margin: 0.5em;">
  Windows OS で動作を確認しています。</p>
            </div>
                <ul><li>
  Java SE 6</li>
                <p style="margin: 0.5em; text-indent: 1em;">
  本記事では Update 4 を使用します。インストール方法については他のサイトを参考にしてください。</p>
                <p style="margin: 0.5em; text-indent: 1em;">
  環境変数 (JAVA_HOME) に ${インストールフォルダ} を、環境変数 (path) に %JAVA_HOME%\bin を忘れずに追加してください。</p>
                </ul>

                <h2 style="color: rgb(0, 128, 0);" id="Chapter3">
3. 本記事の構成</h2>
                <p style="margin: 0.5em; text-indent: 1em;">
  本記事では少しずつ段階を踏んで解説していきたいと思います。『そんなの知ってるよ』という方は読み飛ばしてください。また、本記事は『JAXB 2 の具体的な使用方法』に重点を置いていますので、JAXB 2 の詳細なアーキテクチャについては言及していません。適宜 <a href="http://java.sun.com/javase/ja/6/docs/ja/api/index.html" target="_blank"> JavaDoc (link)</a> を参照して確認してみてください。</p>
                <p style="margin: 0.5em; text-indent: 1em;">
  <b>注意:XML スキーマの詳細な仕様解説は割愛しています。</b></p>
            <div class="emp" style="font-size: smaller; width: 80%;">
                <p style="text-indent: 1em; margin: 0.5em;">
  <b>注意:</b></p>
                <p style="text-indent: 1em; margin: 0.5em;">
  随所で <b>xs:element</b> や <b>xs:complexType</b> と言ったように、<b>xs:</b> を使用しています。<b>xs</b> は <a href="http://www.w3.org/2001/XMLSchema" target="_blank">http://www.w3.org/2001/XMLSchema</a> 名前空間で定義されている要素の接頭辞であることを、予めここで定義しておきます。</p>
            </div>

                <h2 style="color: rgb(0, 128, 0);" id="Chapter4">
4. とりあえず何も考えずに動かしてみよう</h2>
                <p style="margin: 0.5em; text-indent: 1em;">
  まず、複雑なことは一切考えずに以下のプログラムをコーディングして実行してみましょう。</p>
BookOrder.java:<br />
                <pre class="code" style="font-size: smaller; width:80%;">
import java.util.Calendar;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="BookOrder")
@XmlType(propOrder={"title", "category", "author", "price", "publisher", "publishDate"})
public class BookOrder {
    @XmlElement(name="Title")
    private String title;

    @XmlElement(name="Category")
    private String category;

    @XmlElement(name="Author")
    private String author;

    @XmlElement(name="Price")
    private int price;

    @XmlElement(name="Publisher")
    private String publisher;

    @XmlElement(name="PublishDate")
    private Calendar publishDate;

    〜 アクセッサは略 〜
}
                </pre>
Main.java:<br />
                <pre class="code" style="font-size: smaller; width:80%;">
import java.io.File;
import java.text.SimpleDateFormat;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class Main {
    public static void main(String[] args) throws Exception {
        // BookOrder クラスをバインディングするコンテキストを生成
        JAXBContext context = JAXBContext.newInstance(BookOrder.class);

        // XML -> POJO 変換を行うアンマーシャラを生成
        Unmarshaller um = context.createUnmarshaller();
        
        // XML -> POJO 変換
        BookOrder book = (BookOrder)um.unmarshal(new File("[in]SimpleBookOrder.xml"));
        
        System.out.println("タイトル  : " + book.getTitle());
        System.out.println("カテゴリ  : " + book.getCategory());
        System.out.println("著者      : " + book.getAuthor());
        System.out.println("価格(税込): " + book.getPrice());
        System.out.println("出版社    : " + book.getPublisher());
        System.out.println("発売日    : " + new SimpleDateFormat("yyyy/MM/dd").
                                                    format(book.getPublishDate().getTime()));
        // POJO -> XML 変換を行うマーシャラを生成
        Marshaller ma = context.createMarshaller();

        // POJO -> XML 変換
        ma.marshal(book, new File("[out]SimpleBookOrder.xml"));
    }
}
                </pre>
[in]SimpleBookOrder.xml:<br />
                <pre class="code" style="font-size: smaller; width:80%;">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;BookOrder&gt;
    &lt;Title&gt;豆蔵セミナーライブオンテキスト(1) わかるオブジェクト指向&lt;/Title&gt;
    &lt;Category&gt;オブジェクト指向&lt;/Category&gt;
    &lt;Author&gt;山田 隆太&lt;/Author&gt;
    &lt;Price&gt;2604&lt;/Price&gt;
    &lt;Publisher&gt;技術評論社&lt;/Publisher&gt;
    &lt;PublishDate&gt;2005-07-29T00:00:00+09:00&lt;/PublishDate&gt;
&lt;/BookOrder&gt;
                </pre>
                <p style="margin: 0.5em; text-indent: 1em;">
  さて実行してみましょう。XML データがコンソールに出力され、[out]SimpleBookOrder.xml には XML データが出力されているはずです。出力結果は以下の様になります。</p>
コンソール出力:<br />
                <pre class="code" style="font-size: smaller; width:80%;">
タイトル  : 豆蔵セミナーライブオンテキスト(1) わかるオブジェクト指向
カテゴリ  : オブジェクト指向
著者      : 山田 隆太
価格(税込): 2604
出版社    : 技術評論社
発売日    : 2005/07/29
                </pre>
[out]SimpleBookOrder.xml (注意:一行で出力されます) :<br />
                <pre class="code" style="font-size: smaller; width:80%;">
&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;&lt;BookOrder&gt;&lt;Title&gt;豆蔵セミナーライブオンテキスト(1) 
わかるオブジェクト指向&lt;/Title&gt;&lt;Category&gt;オブジェクト指向&lt;/Category&gt;&lt;Author&gt;山田 隆太&lt;/Author&gt;&lt;Price&gt;2604
&lt;/Price&gt;&lt;Publisher&gt;技術評論社&lt;/Publisher&gt;&lt;PublishDate&gt;2005-07-29T00:00:00+09:00&lt;/PublishDate&gt;&lt;/BookOrder&gt;
                </pre>
                <p style="margin: 0.5em; text-indent: 1em;">
  どうですか？複雑な処理は一切コーディングすることなく、簡単に XML データ⇔Java オブジェクト変換が行えました。それでは少しずつ JAXB 2 を理解、楽しんでいきましょう。</p>

                <h3 style="color: rgb(0, 128, 0);">
4.1. JAXB 2 主要クラス</h3>
                <p style="margin: 0.5em; text-indent: 1em;">
  それでは、JAXB 2 の主要クラスから見ていきましょう。JAXB 2 は主に JAXBContext, Unmarshaller, Marshaller から構成されており、それぞれ次のような機能を持ちます。</p>
                <p style="margin: 0.5em; text-indent: 1em;">
<b>JAXB 2 主要クラス</b></p>
                <table style="border: thin solid rgb(0, 0, 0); padding: 0pt; width: 80%;">
                    <tbody>
                        <tr>
                            <td style="border: thin solid rgb(0, 0, 0);" bgcolor="#4f81bd" width="15%">
                                <b>クラス名</b>
                            </td>
                            <td style="border: thin solid rgb(0, 0, 0);" bgcolor="#4f81bd">
                                <b>概要</b>
                            </td>
                        </tr>
                        <tr>
                            <td style="border: thin solid rgb(0, 0, 0);">
                                <b>JAXBContext</b>
                            </td>
                            <td style="border: thin solid rgb(0, 0, 0);">
                                JAXB API へのクライアント (ここでは Main.java) からのエントリポイントを提供します。
                            </td>
                        </tr>
                        <tr>
                            <td style="border: thin solid rgb(0, 0, 0);">
                                <b>Unmarshaller</b>
                            </td>
                            <td style="border: thin solid rgb(0, 0, 0);">
                                XML データを Java オブジェクトに変換 (非整列化) します。
                            </td>
                        </tr>
                        <tr>
                            <td style="border: thin solid rgb(0, 0, 0);">
                                <b>Marshaller</b>
                            </td>
                            <td style="border: thin solid rgb(0, 0, 0);">
                                Java オブジェクトを XML データに変換 (整列化) します。<br>
                                文字コードやインデントなどを指定する場合は、Marshaller#setProperty(Marshaller.JAXB_ENCODING, "UTF-8") などとします。詳しくは <a href="http://java.sun.com/javase/ja/6/docs/ja/api/javax/xml/bind/Marshaller.html" target="_blank">JavaDoc (link)</a> を参照してください。
                            </td>
                        </tr>
                </tbody>
            </table>
            <p style="margin: 0.5em; text-indent: 1em;">
  では次に、ここで使用している JAXB 2 のアノテーションを見ていきましょう。</p>
            <h3 style="color: rgb(0, 128, 0);">
4.1 @XmlRootElement</h3>
            <p style="margin: 0.5em; text-indent: 1em;">
  XML のルート要素となり得るクラスに付与します。name 属性には XML 要素名を指定します。グローバル宣言された xs:element に対応します。</p>
            <div class="emp" style="font-size: smaller; width: 80%;">
                <p style="text-indent: 1em; margin: 0.5em;">
  <b>グローバル宣言:</b></p>
                <p style="text-indent: 1em; margin: 0.5em;">
  スキーマのどこからでも参照出来るように定義するものです。Java で言うところの public フィールドと同等です。</p>
            </div>
            <h3 style="color: rgb(0, 128, 0);">
4.2 @XmlElement</h3>
            <p style="margin: 0.5em; text-indent: 1em;">
  XML の要素となり得るクラスに付与します。name 属性には XML 要素名を指定します。ローカル宣言された xs:element に対応します。</p>
            <div class="emp" style="font-size: smaller; width: 80%;">
                <p style="text-indent: 1em; margin: 0.5em;">
  <b>ローカル宣言:</b></p>
                <p style="text-indent: 1em; margin: 0.5em;">
  宣言した型 (xs:complexType) からのみ参照出来るように定義するものです。Java で言うところの private フィールドと同等です。</p>
            </div>
            <h3 style="color: rgb(0, 128, 0);">
4.3 @XmlType</h3>
            <p style="margin: 0.5em; text-indent: 1em;">
  XML の要素型となり得るクラスに付与します。xs:complexType に対応します。ここでは指定していませんが、name 属性で型名を指定することが出来ます。propOrder 属性には @XmlElement が付与されたフィールドの出現順序を <b>フィールド名</b> で指定します。</p>
            <h3 style="color: rgb(0, 128, 0);">
4.4 @XmlAccessorType</h3>
            <p style="margin: 0.5em; text-indent: 1em;">
  XML データとバインドする対象 (フィールドやプロパティ (アクセッサメソッド)) を指定します。ここでは XmlAccessType.FIELD を指定しているので、フィールドの宣言を基に XML データをバインドします。</p>
            <p style="margin: 0.5em; text-indent: 1em;">
  XML データとバインドする必要がないフィールドに対しては、@XmlTransient を付与します。</p>
            <div class="emp" style="font-size: smaller; width: 80%;">
                <p style="text-indent: 1em; margin: 0.5em;">
  <b>Note:</b></p>
                <p style="text-indent: 1em; margin: 0.5em;">
  デフォルトでは、XmlAccessType.PUBLIC_MEMBER が設定されます。そのため、@XmlAccessorType を定義せずに安易に Setter メソッドと Getter メソッドを実装すると、例外 (com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationException) が送出されます。これを回避するには、Setter メソッドか Getter メソッドに @XmlTransient を付与しますが、特に理由がない場合は XmlAccessType.FIELD を指定する方が良いでしょう。</p>
            </div>
            </td>
        </tr>
        <tr>
            <td align="right"><a href="http://mamezou.net/modules/xfsection/article.php?articleid=110">Next...&nbsp;&gt;&gt;</a></td>
        </tr>
    </tbody>
</table>
      ]]>
    </content>
      </entry>
    <entry>
    <title>JAXB2でXML データバインディング(2)</title>
    <link rel="alternate" type="text/html" href="http://mamezou.net/modules/xfsection/article.php?articleid=110" />
    <modified>2008-03-05T10:44:05+09:00</modified>
    <issued>2008-02-28T11:12:00+09:00</issued>
    <id>tag:sv20.xserverzero.net,2008://1.7.110</id>
        <created>2008-02-28T11:12:00+09:00</created>
            <summary type="text/plain">                                                JAXB 2 で XML データバインディング (2)                  株式会社 豆蔵 五味 和人                  5. スキーマ検証をしてみよう                  さきほどの例で、[in]SimpleBookOrder.xml の要素順序を変え ...</summary>
        <author>
      <name>mameadm</name>
                </author>
        <dc:subject>技術記事</dc:subject>
            <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://sv20.xserverzero.net/~x2020294/">
      <![CDATA[
      <table border="0" cellpadding="2" cellspacing="1" width="100%">
    <tbody>
        <tr>
            <td class="xfartcle" width="100%">
                <h1 style="color: rgb(0, 128, 0);">JAXB 2 で XML データバインディング (2)</h1>
                株式会社 豆蔵 五味 和人<br />

            <h2 style="color: rgb(0, 128, 0);" id="Chapter5">
5. スキーマ検証をしてみよう</h2>
            <p style="margin: 0.5em; text-indent: 1em;">
  さきほどの例で、[in]SimpleBookOrder.xml の要素順序を変えて (Category 要素を Title 要素の前に移動するなど) もう一度実行してみましょう。</p>
            <p style="margin: 0.5em; text-indent: 1em;">
  ちゃんと動いたでしょうか？動きますね。さきほど @XmlType の propOrder 属性で出現順序を指定すると言いました。にも関わらず、要素の出現順序を変えても動いてしまうのはなぜでしょう？XML はデータの構成 (出現順序や出現回数) を厳密に定義出来ることもメリットのひとつであるので、これでは困ってしまいます。</p>
            <p style="margin: 0.5em; text-indent: 1em;">
  いきなり理由を書くと、JAXB 2 はデフォルトでは XML スキーマとの検証を <b>行わない</b> からです。これは当然と言えば当然です。さきほどの例では XML スキーマを作成しませんでしたね。JAXB 2 は動的にアノテーションから XML スキーマを生成・検証するということはしてくれません。</p>
            <p style="margin: 0.5em; text-indent: 1em;">
  『え！？じゃぁ結局スキーマを作成しなきゃならないじゃん。(- -;』と思った方。大丈夫です。JAXB 2 には、『schemagen』というツールが付属されており、(アノテーションが付与された) Java オブジェクトから XML スキーマを <b>自動生成</b> することが出来ます。</p>
            <p style="margin: 0.5em; text-indent: 1em;">
  それではさっそく、XML スキーマを作成して確認してみましょう。</p>
            <p style="margin: 0.5em; text-indent: 1em;">
  コマンドプロンプトを開いて、以下のコマンドを入力し実行してください。</p>
            <div class="emp" style="font-size: smaller; width: 80%;">
                <p style="text-indent: 1em; margin: 0.5em;">
  <b>C:\>schemagen BookOrder.java (パスは環境に合わせて適宜変更してください)</b></p>
            </div>
            <p style="margin: 0.5em; text-indent: 1em;">
  カレントフォルダ (ここでは C:\) に schema1.xsd というファイルが出力されていると思います。生成されたスキーマは以下の様になっていると思います。</p>

            <div class="emp" style="font-size: smaller; width: 80%;">
                <p style="text-indent: 1em; margin: 0.5em;">
  <b>Note:</b></p>
                <p style="text-indent: 1em; margin: 0.5em;">
  執筆時点の schemagen ツールでは、出力する XML スキーマのファイル名を指定出来ないなど、若干使い勝手が悪いものとなっていますが、Ant を使用するとファイル名を指定することが出来ます。Ant を用いた XML スキーマの作成方法については <a href="http://mamezou.net/modules/xfsection/article.php?articleid=112#Chapter13">後述 (link)</a> しますが、ここでは簡略化のため、schemagen ツールを利用することとします。</p>
            </div>

ValidationSchema.xsd (分かりやすくするために名前を変えています) :<br />
            <pre class="code" style="font-size: smaller; width:80%;">
&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;
&lt;xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"&gt;

  &lt;xs:element name="BookOrder" type="bookOrder"/&gt;

  &lt;xs:complexType name="bookOrder"&gt;
    &lt;xs:sequence&gt;
      &lt;xs:element name="Title" type="xs:string" minOccurs="0"/&gt;
      &lt;xs:element name="Category" type="xs:string" minOccurs="0"/&gt;
      &lt;xs:element name="Author" type="xs:string" minOccurs="0"/&gt;
      &lt;xs:element name="Price" type="xs:int"/&gt;
      &lt;xs:element name="Publisher" type="xs:string" minOccurs="0"/&gt;
      &lt;xs:element name="PublishDate" type="xs:dateTime" minOccurs="0"/&gt;
    &lt;/xs:sequence&gt;
  &lt;/xs:complexType&gt;
&lt;/xs:schema&gt;
            </pre>
            <p style="margin: 0.5em; text-indent: 1em;">
  XML スキーマが作成出来たら、次は先ほどの Main.java を以下のように修正します。</p>
Main.java : <br />
            <pre class="code" style="font-size: smaller; width:80%;">
〜 package, imports は略 〜

public class Main {
    public static void main(String[] args) throws Exception {
        JAXBContext context = JAXBContext.newInstance(BookOrder.class);

        // 検証に使用するスキーマを生成 (*1)
        SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Schema schema = schemaFactory.newSchema(new File("ValidationSchema.xsd"));

        Unmarshaller um = context.createUnmarshaller();

        // アンマーシャル時に使用する検証スキーマを設定 (*2)
        um.setSchema(schema);

        BookOrder book = (BookOrder)um.unmarshal(new File("[in]ValidateBookOrder.xml"));

        〜 System.out.println は略 〜

        Marshaller ma = context.createMarshaller();
        
        // マーシャル時に使用する検証スキーマを設定 (*3)
        ma.setSchema(schema);

        ma.marshal(book, new File("[out]ValidateBookOrder.xml"));
    }
}
            </pre>
            <p style="margin: 0.5em; text-indent: 1em;">
            <ul><li>
  (*1) では、ValidationSchema.xsd を基に Schema オブジェクトを生成しています。これは、スキーマの外部表現を読み取り、検証するための準備となります。ちなみに、SchemaFactory はスレッドセーフではないため、注意が必要です。</li>
            <li>
  (*2) では、アンマーシャル時に使用する検証スキーマを設定しています。スキーマに準拠していない XML データをアンマーシャルしようとすると (Unmarshaller#unmarshal() メソッドを呼び出すと) 例外 (javax.xml.bind.UnmarshalException) が送出されます。</li>
            <li>
  (*3) では、同様にマーシャル時に使用する検証スキーマを設定しています。</li>
            </ul>
            <p style="margin: 0.5em; text-indent: 1em;">
  それでは、[in]SimpleBookOrder.xml の要素順序を変えて (ここでは、要素順序を変えた XML を [in]ValidationBookOrder.xml に名前を変えています) もう一度実行してみましょう。今度は例外が送出されるはずです。厳密な XML データ変換を行いたい場合は、このようにスキーマを生成してから行うことで、アプリケーションによるデータ正当性の確認ロジックを JAXB 2 に委譲することが出来ます。</p>
[in]ValidationBookOrder.xml:<br />
            <pre class="code" style="font-size: smaller; width:80%;">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;BookOrder&gt;
    &lt;Category&gt;オブジェクト指向&lt;/Category&gt;
    &lt;Title&gt;豆蔵セミナーライブオンテキスト(1) わかるオブジェクト指向&lt;/Title&gt;
    &lt;Author&gt;山田 隆太&lt;/Author&gt;
    &lt;Price&gt;2604&lt;/Price&gt;
    &lt;Publisher&gt;技術評論社&lt;/Publisher&gt;
    &lt;PublishDate&gt;2005-07-29T00:00:00+09:00&lt;/PublishDate&gt;
&lt;/BookOrder&gt;
            </pre>
コンソール出力:<br />

            <pre class="code" style="font-size: smaller; width:80%;">
Exception in thread "main" javax.xml.bind.UnmarshalException
 - with linked exception:
[org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'Title'.
 One of '{Author, Price}' is expected.]
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(Unknown Source)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.createUnmarshalException(Unknown Source)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(Unknown Source)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(Unknown Source)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
    at com.mamezou.jaxb2.validate.Main.main(Main.java:28)
〜 略 〜
            </pre>

            <div class="emp" style="font-size: smaller; width: 80%;">
                <p style="text-indent: 1em; margin: 0.5em;">
  <b>Note:</b></p>
                <p style="text-indent: 1em; margin: 0.5em;">
  UnMarshaller#setValidating() メソッドは非推奨となったため、使用しないことをお勧めします。</p>
            </div>


            <h2 style="color: rgb(0, 128, 0);" id="Chapter6">
6. 繰り返し定義をしてみよう</h2>
            <p style="margin: 0.5em; text-indent: 1em;">
  今度は繰り返し要素の定義をしてみましょう。例えば書籍だと共著ということがありますね。ここでは、Author 要素を繰り返し記述出来るようにしてみます。繰り返し要素を定義するには、該当のフィールド (ここでは BookOrder#author フィールド) を配列、または List<T> で定義します。</p>
            <p style="margin: 0.5em; text-indent: 1em;">
  修正したら schemagen ツールで XML スキーマを作成してみましょう。生成したスキーマは次の様になっていると思います。</p>
ArraySchema.xsd (分かりやすくするために名前を変えています) :<br />
            <pre class="code" style="font-size: smaller; width: 80%;">
&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;
&lt;xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"&gt;

  &lt;xs:element name="BookOrder" type="bookOrder"/&gt;

  &lt;xs:complexType name="bookOrder"&gt;
    &lt;xs:sequence&gt;
      &lt;xs:element name="Title" type="xs:string" minOccurs="0"/&gt;
      &lt;xs:element name="Category" type="xs:string" minOccurs="0"/&gt;
      &lt;xs:element name="Author" type="xs:string" minOccurs="0" maxOccurs="unbounded"/&gt;
      &lt;xs:element name="Price" type="xs:int"/&gt;
      &lt;xs:element name="Publisher" type="xs:string" minOccurs="0"/&gt;
      &lt;xs:element name="PublishDate" type="xs:dateTime" minOccurs="0"/&gt;
    &lt;/xs:sequence&gt;
  &lt;/xs:complexType&gt;
&lt;/xs:schema&gt;
            </pre>
            <p style="margin: 0.5em; text-indent: 1em;">
  Author 要素の maxOccurs 属性 (最大出現回数) が unbounded (無制限) になっていますね。これで完了です。それでは入力となる XML ファイルに Author 要素を複数回記述してみましょう。例えば以下のようになります (適宜改行しています)。</p>
[in]ArrayBookOrder.xml:<br />
            <pre class="code" style="font-size: smaller; width: 80%;">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;BookOrder&gt;
  &lt;Title&gt;豆蔵セミナーライブオンテキスト(3) Java・オブジェクト指向の壁を突破する 抽象化プログラミング入門 
-UMLからJavaへ、すらすらコーディングできますか? &lt;/Title&gt;
  &lt;Category&gt;オブジェクト指向&lt;/Category&gt;
  &lt;Author&gt;岡村 敦彦&lt;/Author&gt;
  &lt;Author&gt;山田 隆太&lt;/Author&gt;
  &lt;Price&gt;2604&lt;/Price&gt;
  &lt;Publisher&gt;技術評論社&lt;/Publisher&gt;
  &lt;PublishDate&gt;2005-07-29T00:00:00+09:00&lt;/PublishDate&gt;
&lt;/BookOrder&gt;
            </pre>
            <p style="margin: 0.5em; text-indent: 1em;">
  では、Main.java を修正して実行してみましょう。もちろん、BookOrder#getAuthor() メソッドは配列、または List<String> を返すように修正されているはずですから、Main.java もそれに合わせて修正します。修正が終わったら実行してみてください。岡村さん、山田さんの両方がきちんと表示されましたか？特にアノテーションを変更することなく、フィールドの型を変更するだけで繰り返しを表現することが出来ました。とても簡単です。</p>
            <p style="text-indent: 1em; margin: 0.5em;">
  例では、『最大出現回数は無制限 (maxOccurs="unbounded")』になりましたが、通常の XML データ定義では、『出現回数は 2 回まで』と言ったように制限を付与したいことがあります。しかし、<a href="http://java.sun.com/javase/ja/6/docs/ja/api/javax/xml/bind/annotation/XmlElement.html" target="_blank">JavaDoc (link)</a> を見渡しても最大出現回数を指定するような属性が見つかりません。残念ながら、<b>アノテーションでは</b> 最大出現回数を指定出来ないのかも知れません (ちなみに minOccurs も 0 か 1 しか指定出来ません)。</p>
            <div class="emp" style="font-size: smaller; width: 80%;">
                <p style="text-indent: 1em; margin: 0.5em;">
  <b>Note:</b></p>
                <p style="text-indent: 1em; margin: 0.5em;">
  JAXB 1.x 系では、maxOccurs に非常に大きな値を設定すると java.lang.OutOfMemoryError が発生するという制約がありました <a href="https://jaxb.dev.java.net/jaxb20-ea3/docs/jaxb-1_0.html" target="_blank">(<a href="https://jaxb.dev.java.net/jaxb20-ea3/docs/jaxb-1_0.html" target="_blank">https://jaxb.dev.java.net/jaxb20-ea3/docs/jaxb-1_0.html</a>)</a>。そのため、大きな値を設定する代わりに unbounded を指定すると言った、ある種ウラ技を使わなければなりませんでした。JAXB 2.x 系は完全後方互換性を謳っているため、maxOccurs に下手に大きな値を設定されると困るといった事情があるのかも知れません。</p>
                <p style="text-indent: 1em; margin: 0.5em;">
  先ほど、<b>アノテーションでは</b> と解説しました。どういうことかと言うと、<b>XML スキーマ</b> でなら指定が出来るのです。<b>XML スキーマ</b> で指定された maxOccurs の値はスキーマ検証時に正しく認識されます。つまり、XML スキーマ上で maxOccurs="2" と指定している要素が 3 回以上出現すると例外が送出されるのです。要は XML スキーマで maxOccurs を設定してしまえば出来なくはないのです。</p>
                <p style="text-indent: 1em; margin: 0.5em;">
  しかし、自動生成したスキーマを編集することには賛否両論があると思います。むしろ否を唱える方が多いでしょう。これについては <a href="http://mamezou.net/modules/xfsection/article.php?articleid=112#Chapter14">後述 (link)</a> します。</p>
                </div>
            <h3 style="color: rgb(0, 128, 0);">
6.1 @XmlElementWrapper</h3>
                <p style="text-indent: 1em; margin: 0.5em;">
  Author 要素が複数回出現するのだから、上位に Authors 要素を加えたくなりますよね？そんなときは @XmlElementWrapper を使用します。@XmlElementWrapper は、その名の通り、ある要素を包み込みだけの場合に使用します。BookOrder クラスを以下のように修正後、XML スキーマを再作成しましょう。もちろん、入力となる XML データも併せて修正してください。</p>
BookOrder.java:<br />
            <pre class="code" style="font-size: smaller; width: 80%;">
@XmlElementWrapper(name="Authors")
@XmlElement(name="Author")
private String[] author;
            </pre>
[in]ArrayBookOrder.xml:<br />
            <pre class="code" style="font-size: smaller; width: 80%;">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;BookOrder&gt;
  &lt;Title&gt;豆蔵セミナーライブオンテキスト(3) Java・オブジェクト指向の壁を突破する 抽象化プログラミング入門 
-UMLからJavaへ、すらすらコーディングできますか? &lt;/Title&gt;
  &lt;Category&gt;オブジェクト指向&lt;/Category&gt;
  &lt;Authors&gt;
    &lt;Author&gt;岡村 敦彦&lt;/Author&gt;
    &lt;Author&gt;山田 隆太&lt;/Author&gt;
  &lt;/Authors&gt;
  &lt;Price&gt;2604&lt;/Price&gt;
  &lt;Publisher&gt;技術評論社&lt;/Publisher&gt;
  &lt;PublishDate&gt;2005-07-29T00:00:00+09:00&lt;/PublishDate&gt;
&lt;/BookOrder&gt;
            </pre>
                <p style="text-indent: 1em; margin: 0.5em;">
  Main.java は一切変更せずに実行してみてください。正常に出力されましたか？されたと思います。</p>
                <p style="text-indent: 1em; margin: 0.5em;">
  Main.java を変更することなくラッピング要素 (Authors 要素) を追加することが出来ました。JAXB 2 は XML スキーマの変更に柔軟に対応できるように実装されていることが分かります。</p>

            <div class="emp" style="font-size: smaller; width: 80%;">
                <p style="margin: 0.5em; text-indent: 1em;">
  <b>Note:</b></p>
                <p style="margin: 0.5em; text-indent: 1em;">
  複数の要素を @XmlElementWrapper によってラップすることは出来ません。そのようにしたい場合は、<a href="#Chapter6.2">後述 (link)</a> の方法を採ります。</p>
            </div>

            <h3 style="color: rgb(0, 128, 0);" id="Chapter6.2">
6.2. @XmlElementWrapper を使用せずにラッピング要素を定義をしてみよう</h3>
            <p style="margin: 0.5em; text-indent: 1em;">
  例えば、書籍注文だと複数の書籍を同時に注文することがありますね。ここでは、Book 要素を新たに追加し、ルート要素である BookOrder 要素配下に複数の Book 要素を記述出来るようにしてみます。これまで BookOrder 要素配下に定義していた Title 要素などは Book 要素に移動します。</p>
BookOrder.java:<br />
            <pre class="code" style="font-size: smaller; width: 80%;">
〜 package, imports は略 〜

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="BookOrder")
public class BookOrder {
    @XmlElement(name="Book")
    private List&lt;Book&gt; books;

    〜 アクセッサは略 〜
}
            </pre>
Book.java:<br />
            <pre class="code" style="font-size: smaller; width: 80%;">
〜 package, imports は略 〜

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={"title", "category", "author", "price", "publisher", "publishDate"})
public class Book {
    〜 略 〜
}
            </pre>
            <p style="margin: 0.5em; text-indent: 1em;">
  ここでは、Book クラスに @XmlType だけを付加し、要素型として定義します。修正したら XML スキーマを作成してみましょう。生成したスキーマは次の様になっていると思います。</p>
SequenceSchema.xsd (分かりやすくするために名前を変えています) :<br />
            <pre class="code" style="font-size: smaller; width: 80%;">
&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;
&lt;xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"&gt;

  &lt;xs:element name="BookOrder" type="bookOrder"/&gt;

  &lt;xs:complexType name="bookOrder"&gt;
    &lt;xs:sequence&gt;
      &lt;xs:element name="Book" type="book" minOccurs="0" maxOccurs="unbounded"/&gt;
    &lt;/xs:sequence&gt;
  &lt;/xs:complexType&gt;

  &lt;xs:complexType name="book"&gt;
    &lt;xs:sequence&gt;
      &lt;xs:element name="Title" type="xs:string" minOccurs="0"/&gt;
      &lt;xs:element name="Category" type="xs:string" minOccurs="0"/&gt;
      &lt;xs:element name="Authors" minOccurs="0"&gt;
        &lt;xs:complexType&gt;
          &lt;xs:sequence&gt;
            &lt;xs:element name="Author" type="xs:string" minOccurs="0" maxOccurs="unbounded"/&gt;
          &lt;/xs:sequence&gt;
        &lt;/xs:complexType&gt;
      &lt;/xs:element&gt;
      &lt;xs:element name="Price" type="xs:int"/&gt;
      &lt;xs:element name="Publisher" type="xs:string" minOccurs="0"/&gt;
      &lt;xs:element name="PublishDate" type="xs:dateTime" minOccurs="0"/&gt;
    &lt;/xs:sequence&gt;
  &lt;/xs:complexType&gt;
&lt;/xs:schema&gt;
            </pre>
            <p style="margin: 0.5em; text-indent: 1em;">
  それでは XML データを定義してみましょう。ここでは以下の XML データを定義します。</p>
[in]SequenceSchema.xml:<br />
            <pre class="code" style="font-size: smaller; width: 80%;">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;BookOrder&gt;
  &lt;Book&gt;
    &lt;Title&gt;豆蔵セミナーライブオンテキスト(1) わかるオブジェクト指向&lt;/Title&gt;
    &lt;Category&gt;オブジェクト指向&lt;/Category&gt;
    &lt;Authors&gt;
      &lt;Author&gt;山田 隆太&lt;/Author&gt;
    &lt;/Authors&gt;
    &lt;Price&gt;2604&lt;/Price&gt;
    &lt;Publisher&gt;技術評論社&lt;/Publisher&gt;
    &lt;PublishDate&gt;2005-07-29T00:00:00+09:00&lt;/PublishDate&gt;
  &lt;/Book&gt;
  &lt;Book&gt;
    &lt;Title&gt;豆蔵セミナーライブオンテキスト(2) すいすい習得 UMLモデリング&lt;/Title&gt;
    &lt;Category&gt;モデリング&lt;/Category&gt;
    &lt;Authors&gt;
      &lt;Author&gt;岡村 敦彦&lt;/Author&gt;
    &lt;/Authors&gt;
    &lt;Price&gt;2604&lt;/Price&gt;
    &lt;Publisher&gt;技術評論社&lt;/Publisher&gt;
    &lt;PublishDate&gt;2006-04-11T00:00:00+09:00&lt;/PublishDate&gt;
  &lt;/Book&gt;
  &lt;Book&gt;
    &lt;Title&gt;豆蔵セミナーライブオンテキスト(3) Java・オブジェクト指向の壁を突破する 抽象化プログラミング入門 
-UMLからJavaへ、すらすらコーディングできますか? &lt;/Title&gt;
    &lt;Category&gt;オブジェクト指向&lt;/Category&gt;
    &lt;Authors&gt;
      &lt;Author&gt;岡村 敦彦&lt;/Author&gt;
      &lt;Author&gt;山田 隆太&lt;/Author&gt;
    &lt;/Authors&gt;
    &lt;Price&gt;2604&lt;/Price&gt;
    &lt;Publisher&gt;技術評論社&lt;/Publisher&gt;
    &lt;PublishDate&gt;2005-07-29T00:00:00+09:00&lt;/PublishDate&gt;
  &lt;/Book&gt;
&lt;/BookOrder&gt;
            </pre>
            <p style="margin: 0.5em; text-indent: 1em;">
  Main.java を修正して実行してみましょう。正しく実行されれば OK です。</p>

            <h2 style="color: rgb(0, 128, 0);" id="Chapter7">
7. 選択定義をしてみよう</h2>
            <p style="margin: 0.5em; text-indent: 1em;">
  選択要素の定義をしてみましょう。例えば書籍だとタイトル、または ISBN で特定することがありますね。ここでは、Title 要素と ISBN 要素のいずれかを選択出来るように定義してみます。選択要素を定義するには、@XmlElements と @XmlElement を使用します。</p>
            <div class="emp" style="font-size: smaller; width: 80%;">
                <p style="margin: 0.5em; text-indent: 1em;">
  @XmlElementRefs と @XmlElementRef を使用する方法もありますが、ここでは割愛します。</p>
            </div>
            <p style="margin: 0.5em; text-indent: 1em;">
  Book.java の title フィールド (宣言とアクセッサメソッド) を削除し、id フィールド (宣言とアクセッサメソッド) を追加します。@XmlType の propOrder 属性も title から id に変更します。</p>
Book.java:<br />
            <pre class="code" style="font-size: smaller; width: 80%;">
〜 package, imports は略 〜

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={"id", "category", "author", "price", "publisher", "publishDate"})
public class Book {
    @XmlElements(value={
            @XmlElement(name="Title", type=String.class), 
            @XmlElement(name="ISBN", type=String.class)})
    private String id;
    
    〜 略 〜

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    〜 略 〜
}
            </pre>
            <p style="margin: 0.5em; text-indent: 1em;">
  XML スキーマを作成してみましょう。生成したスキーマは次の様になっていると思います。</p>
ChoiceSchema.xsd (分かりやすくするために名前を変えています) :<br />
            <pre class="code" style="font-size: smaller; width: 80%;">
&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;
&lt;xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"&gt;

  &lt;xs:element name="BookOrder" type="bookOrder"/&gt;

  &lt;xs:complexType name="bookOrder"&gt;
    &lt;xs:sequence&gt;
      &lt;xs:element name="Book" type="book" minOccurs="0" maxOccurs="unbounded"/&gt;
    &lt;/xs:sequence&gt;
  &lt;/xs:complexType&gt;

  &lt;xs:complexType name="book"&gt;
    &lt;xs:sequence&gt;
      &lt;xs:choice minOccurs="0"&gt;
        &lt;xs:element name="Title" type="xs:string"/&gt;
        &lt;xs:element name="ISBN" type="xs:string"/&gt;
      &lt;/xs:choice&gt;
      &lt;xs:element name="Category" type="xs:string" minOccurs="0"/&gt;
      &lt;xs:element name="Authors" minOccurs="0"&gt;
        &lt;xs:complexType&gt;
          &lt;xs:sequence&gt;
            &lt;xs:element name="Author" type="xs:string" minOccurs="0" maxOccurs="unbounded"/&gt;
          &lt;/xs:sequence&gt;
        &lt;/xs:complexType&gt;
      &lt;/xs:element&gt;
      &lt;xs:element name="Price" type="xs:int"/&gt;
      &lt;xs:element name="Publisher" type="xs:string" minOccurs="0"/&gt;
      &lt;xs:element name="PublishDate" type="xs:dateTime" minOccurs="0"/&gt;
    &lt;/xs:sequence&gt;
  &lt;/xs:complexType&gt;
&lt;/xs:schema&gt;
            </pre>
            <p style="margin: 0.5em; text-indent: 1em;">
  次に XML データを定義してみましょう。一方の Book 要素は Title 要素を、もう一方の Book 要素は ISBN 要素を持つようにします。</p>
[in]ChoiceBookOrder.xml:<br />
            <pre class="code" style="font-size: smaller; width: 80%;">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;BookOrder&gt;
  &lt;Book&gt;
    &lt;Title&gt;豆蔵セミナーライブオンテキスト(1) わかるオブジェクト指向&lt;/Title&gt;
    &lt;Category&gt;オブジェクト指向&lt;/Category&gt;
    &lt;Authors&gt;
      &lt;Author&gt;山田 隆太&lt;/Author&gt;
    &lt;/Authors&gt;
    &lt;Price&gt;2604&lt;/Price&gt;
    &lt;Publisher&gt;技術評論社&lt;/Publisher&gt;
    &lt;PublishDate&gt;2005-07-29T00:00:00+09:00&lt;/PublishDate&gt;
  &lt;/Book&gt;
  &lt;Book&gt;
    &lt;ISBN&gt;978-4774127392&lt;/ISBN&gt;
    &lt;Category&gt;モデリング&lt;/Category&gt;
    &lt;Authors&gt;
      &lt;Author&gt;岡村 敦彦&lt;/Author&gt;
    &lt;/Authors&gt;
    &lt;Price&gt;2604&lt;/Price&gt;
    &lt;Publisher&gt;技術評論社&lt;/Publisher&gt;
    &lt;PublishDate&gt;2006-04-11T00:00:00+09:00&lt;/PublishDate&gt;
  &lt;/Book&gt;
&lt;/BookOrder&gt;
            </pre>
            <p style="margin: 0.5em; text-indent: 1em;">
  Main.java を修正して実行してみましょう (getTitle メソッド呼び出しを getId メソッド呼び出しに変更します)。前者には Title 要素の値が、後者には ISBN 要素の値が出力されていれば成功です。実行結果は以下の通りです。</p>
コンソール出力:<br />
            <pre class="code" style="font-size: smaller; width: 80%;">
タイトル(ISBN) : 豆蔵セミナーライブオンテキスト(1) わかるオブジェクト指向
カテゴリ       : オブジェクト指向
著者           : 山田 隆太
価格(税込)     : 2604
出版社         : 技術評論社
発売日         : 2005/07/29

タイトル(ISBN) : 978-4774127392
カテゴリ       : モデリング
著者           : 岡村 敦彦
価格(税込)     : 2604
出版社         : 技術評論社
発売日         : 2006/04/11
            </pre>
            <p style="margin: 0.5em; text-indent: 1em;">
  Main.java からは Book クラスの id フィールドに対してアクセスすれば良いので、Main クラスからは、XML データに Title 要素が記述されているのか、ISBN 要素が記述されているのかは透過的になります。</p>

            <div class="emp" style="font-size: smaller; width: 80%;">
                <p style="margin: 0.5em; text-indent: 1em;">
  <b>Note:</b></p>
                <p style="margin: 0.5em; text-indent: 1em;">
  この <b>透過的アクセス</b> は非常に強力な機能です。JAXB 1.x 系で透過的アクセスを行うには、独自ラッパークラスを作成するか、または xsi:type を使用すると言った、非常に煩雑な (複雑になりすぎる) XML スキーマを定義しなくてはならなかったのですから (経験談)。
            </div>

            <h2 style="color: rgb(0, 128, 0);" id="Chapter8">
8. all 定義をしてみよう</h2>
            <p style="margin: 0.5em; text-indent: 1em;">
  all 定義をしてみましょう。all 定義は順序定義とほぼ同等で、@XmlType の propOrder 属性に <b>何も指定しない</b> ようにします。propOrder 属性を指定しないのとは等価ではありませんので注意してください。</p>
            <div class="emp" style="font-size: smaller; width: 80%;">
                <p style="margin: 0.5em; text-indent: 1em;">
  <b>Note:</b></p>
                <p style="margin: 0.5em; text-indent: 1em;">
  propOrder 属性を指定しないと、「要素の出現順序は未定義である」と同等と解釈されます。フィールドの定義順序と同じ順序でスキーマが生成されるかも知れませんが、必ずしもこのように生成されるとは保証されていません。</p>
            </div>

Book.java:<br />
            <pre class="code" style="font-size: smaller; width: 80%;">
@XmlType(propOrder={})
            </pre>
            <p style="margin: 0.5em; text-indent: 1em;">
  生成した XML スキーマは、以下に示すように xs:all で定義されていると思います。</p>
AllSchema.xsd:<br />
            <pre class="code" style="font-size: smaller; width: 80%;">
&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;
&lt;xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"&gt;

  &lt;xs:element name="BookOrder" type="bookOrder"/&gt;

  &lt;xs:complexType name="bookOrder"&gt;
    &lt;xs:sequence&gt;
      &lt;xs:element name="Book" type="book" minOccurs="0" maxOccurs="unbounded"/&gt;
    &lt;/xs:sequence&gt;
  &lt;/xs:complexType&gt;

  &lt;xs:complexType name="book"&gt;
    &lt;xs:all&gt;
      &lt;xs:element name="Title" type="xs:string" minOccurs="0"/&gt;
      &lt;xs:element name="Category" type="xs:string" minOccurs="0"/&gt;
      &lt;xs:element name="Authors" minOccurs="0"&gt;
        &lt;xs:complexType&gt;
          &lt;xs:sequence&gt;
            &lt;xs:element name="Author" type="xs:string" minOccurs="0" maxOccurs="unbounded"/&gt;
          &lt;/xs:sequence&gt;
        &lt;/xs:complexType&gt;
      &lt;/xs:element&gt;
      &lt;xs:element name="Price" type="xs:int"/&gt;
      &lt;xs:element name="Publisher" type="xs:string" minOccurs="0"/&gt;
      &lt;xs:element name="PublishDate" type="xs:dateTime" minOccurs="0"/&gt;
    &lt;/xs:all&gt;
  &lt;/xs:complexType&gt;
&lt;/xs:schema&gt;
            </pre>
            </td>
        </tr>
        <tr>
            <td align="left"><a href="http://mamezou.net/modules/xfsection/article.php?articleid=109">&lt;&lt;&nbsp;Prev...</a></td>
            <td align="right"><a href="http://mamezou.net/modules/xfsection/article.php?articleid=111">Next...&nbsp;&gt;&gt;</a></td>
        </tr>
    </tbody>
</table>
<br />
<table>
    <tbody>
        <tr><td>page 1</td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=109#Chapter1">1. JAXB とは</a></td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=109#Chapter2">2. 必要な環境</a></td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=109#Chapter3">3. 本記事の構成</a></td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=109#Chapter4">4. とりあえず何も考えずに動かしてみよう</a></td></tr>
        <tr><td>page 2</td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=110#Chapter5">5. スキーマ検証をしてみよう</a></td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=110#Chapter6">6. 繰り返し定義をしてみよう</a></td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=110#Chapter7">7. 選択定義をしてみよう</a></td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=110#Chapter8">8. all 定義をしてみよう</a></td></tr>
        <tr><td>page 3</td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=111#Chapter9">9. デフォルト値を設定してみよう</a></td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=111#Chapter10">10. 固定値を設定してみよう</a></td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=111#Chapter11">11. 名前空間を設定してみよう</a></td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=111#Chapter12">12. グローバル宣言された要素を参照してみよう</a></td></tr>
        <tr><td>page 4</td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=112#Chapter13">13. Ant から schemagen ツールを実行してみよう</a></td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=112#Chapter14">14. XML スキーマから Java オブジェクトを生成してみよう</a></td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=112#End">おわりに</a></td></tr>
    </tbody>
</table>
      ]]>
    </content>
      </entry>
    <entry>
    <title>JAXB2でXMLデータバインディング(3)</title>
    <link rel="alternate" type="text/html" href="http://mamezou.net/modules/xfsection/article.php?articleid=111" />
    <modified>2008-03-05T10:43:09+09:00</modified>
    <issued>2008-02-28T11:18:05+09:00</issued>
    <id>tag:sv20.xserverzero.net,2008://1.7.111</id>
        <created>2008-02-28T11:18:05+09:00</created>
            <summary type="text/plain">                                                JAXB 2 で XML データバインディング (3)                  株式会社 豆蔵 五味 和人                  9. デフォルト値を設定してみよう                  XML データに値が設定されていなかった場合のデフォルト ...</summary>
        <author>
      <name>mameadm</name>
                </author>
        <dc:subject>技術記事</dc:subject>
            <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://sv20.xserverzero.net/~x2020294/">
      <![CDATA[
      <table border="0" cellpadding="2" cellspacing="1" width="100%">
    <tbody>
        <tr>
            <td class="xfartcle" width="100%">
                <h1 style="color: rgb(0, 128, 0);">JAXB 2 で XML データバインディング (3)</h1>
                株式会社 豆蔵 五味 和人<br />

            <h2 style="color: rgb(0, 128, 0);" id="Chapter9">
9. デフォルト値を設定してみよう</h2>
            <p style="margin: 0.5em; text-indent: 1em;">
  XML データに値が設定されていなかった場合のデフォルト値を指定してみましょう。デフォルト値を指定するには、@XmlElement の defaultValue 属性を使用します。</p>
Book.java:<br />
            <pre class="code" style="font-size: smaller; width: 80%;">
〜 package, imports は略 〜

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={"id", "category", "author", "price", "publisher", "publishDate"})
public class Book {
    @XmlElements(value={
            @XmlElement(name="Title", type=String.class), 
            @XmlElement(name="ISBN", type=String.class)})
    private String id;

    @XmlElement(name="Category", defaultValue="分類なし")
    private String category;

    @XmlElementWrapper(name="Authors")
    @XmlElement(name="Author")
    private String[] author;

    @XmlElement(name="Price")
    private int price;

    @XmlElement(name="Publisher", defaultValue="不明")
    private String publisher;

    @XmlElement(name="PublishDate")
    private Calendar publishDate;

    〜 アクセッサは略 〜
}
            </pre>
            <p style="margin: 0.5em; text-indent: 1em;">
  では、XML スキーマを作成し、次の XML データを変換してみましょう。</p>
[in]DefaultValueBookOrder.xml:<br />
            <pre class="code" style="font-size: smaller; width: 80%;">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;BookOrder&gt;
  &lt;Book&gt;
    &lt;Title&gt;豆蔵セミナーライブオンテキスト(1) わかるオブジェクト指向&lt;/Title&gt;
    &lt;Category&gt;&lt;/Category&gt;
    &lt;Authors&gt;
      &lt;Author&gt;山田 隆太&lt;/Author&gt;
    &lt;/Authors&gt;
    &lt;Price&gt;2604&lt;/Price&gt;
    &lt;PublishDate&gt;2005-07-29T00:00:00+09:00&lt;/PublishDate&gt;
  &lt;/Book&gt;
&lt;/BookOrder&gt;
            </pre>
            <p style="margin: 0.5em; text-indent: 1em;">
  出力結果は以下のようになります。</p>
コンソール出力:<br />
            <pre class="code" style="font-size: smaller; width: 80%;">
タイトル(ISBN) : 豆蔵セミナーライブオンテキスト(1) わかるオブジェクト指向
カテゴリ       : 分類なし
著者           : 山田 隆太
価格(税込)     : 2604
出版社         : null
発売日         : 2005/07/29
            </pre>
            <p style="margin: 0.5em; text-indent: 1em;">
  『カテゴリ』にはデフォルト値である "分類なし" が出力されていますが、『出版社』にはデフォルト値が出力されていません。XML データをもう一度確認してみましょう。『Category』要素が空要素であるのに対し、『Publisher』要素が存在しないことが確認出来ます。<p>
            <p style="margin: 0.5em; text-indent: 1em;">
  JavaDoc を確認してみましょう。<a href="http://java.sun.com/javase/ja/6/docs/ja/api/javax/xml/bind/annotation/XmlElement.html#defaultValue()" target="_blank">JavaDoc (link)</a> にはこのよう記述されています。</p>
            <div class="emp" style="font-size: smaller; width: 80%;">
  この要素のデフォルト値です。<br />
  この注釈要素のデフォルトとして指定されている「」値は、null の代わりに使用して実装が非デフォルト値の状態を認識できるようにする経済的な代替品です。<br />
            </div>
            <p style="margin: 0.5em; text-indent: 1em;">
  わかりずらっ！まぁ『空要素と要素自体がないのとは違いますよ。』と。『defaultValue で設定した値は空要素の場合にのみ設定されますよ。』ということですね。XML では、空要素であることと、要素自体が存在しないことは等価ではありませんので、JAXB もこれに準拠して動作します。

            <h2 style="color: rgb(0, 128, 0);" id="Chapter10">
10. 固定値を設定してみよう</h2>
            <p style="margin: 0.5em; text-indent: 1em;">
  固定値とは、「属性や要素の値は必ず定められた値でなくてはならない」ことを定義するもので、fixed 属性によって XML スキーマで定義されます。JAXB 1.x 系ではこの fixed 属性はサポートされていませんでした。JAXB 2 ではどうでしょう？</p>
            <p style="margin: 0.5em; text-indent: 1em;">
  JavaDoc で <a href="http://java.sun.com/javase/ja/6/docs/ja/api/javax/xml/bind/annotation/XmlElement.html" target="_blank">@XmlElement (link)</a> や <a href="http://java.sun.com/javase/ja/6/docs/ja/api/javax/xml/bind/annotation/XmlAttribute.html" target="_blank">@XmlAttribute (link)</a> を見る限り、fixed 属性を定義するような方法は見当たりません。JAXB 2 は XML スキーマの完全準拠が謳われていますが、リファレンスインプリメンテーション (RI) では完全準拠に至っていないようです。</p>
            <h3 style="color: rgb(0, 128, 0);">
10.1. 属性の固定値設定</h3>
            <p style="text-indent: 1em; margin: 0.5em;">
  xs:attribute に fixed 属性を指定するには、xjc ツールを用いて、XML スキーマ⇒Java オブジェクト変換を行う必要があります。その際、XML スキーマには以下のような指定も併せて記述する必要があります (xjc ツールの使用方法については <a href="http://mamezou.net/modules/xfsection/article.php?articleid=112#Chapter14">後述 (link)</a> します)。</p>

            <pre class="code" style="font-size: smaller; width: 80%;">
&lt;xsd:annotation&gt;
  &lt;xsd:appinfo&gt;
      &lt;jaxb:property fixedAttributeAsConstantProperty="true"/&gt;
  &lt;/xsd:appinfo&gt;
&lt;/xsd:annotation&gt;
            </pre>
            <p style="text-indent: 1em; margin: 0.5em;">
  このとき、xs:schema に 属性値として以下の記述も併せて行います。</p>
            <pre class="code" style="font-size: smaller; width: 80%;">
jaxb:version="1.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
            </pre>

            <p style="text-indent: 1em; margin: 0.5em;">
  fixed 属性が付与された属性は、public static final フィールドとしてクラス内に定義されます。</p>

            <h3 style="color: rgb(0, 128, 0);">
10.2. 要素の固定値設定</h3>
            <p style="margin: 0.5em; text-indent: 1em;">
  要素に対する fixed 属性はサポートされていません。</p>

            <h2 style="color: rgb(0, 128, 0);" id="Chapter11">
11. 名前空間を設定してみよう</h2>
            <p style="margin: 0.5em; text-indent: 1em;">
  名前空間とは、Java で言う「package」、.NET で言う「namespace」と同じ概念であり、タグ名の衝突を防ぐためのものです。名前空間を定義するには、@XmlRootElement や @XmlType に namespace 属性を付与するだけです。ここでは、複数のクラスを同一の名前空間として定義した場合と、異なる名前空間として定義した場合を見ていきましょう。
            <h3 style="color: rgb(0, 128, 0);">
11.1. 同一名前空間</h3>
            <p style="margin: 0.5em; text-indent: 1em;">
  上述した通り、名前空間を設定するには、namespace 属性を使用します。それでは、BookOrder クラス、Book クラスに名前空間を付与してみましょう。</p>
BookOrder.java:<br />
            <pre class="code" style="font-size: smaller; width: 80%;">
〜 package, imports は略 〜

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "BookOrder", namespace="http://www.mamezou.com/jaxb2/namespace")
@XmlType(namespace="http://www.mamezou.com/jaxb2/namespace")
public class BookOrder {
〜 略 〜
}
            </pre>
Book.java:<br />
            <pre class="code" style="font-size: smaller; width: 80%;">
〜 package, imports は略 〜

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={"id", "category", "author", "price", "publisher", "publishDate"},
         namespace="http://www.mamezou.com/jaxb2/namespace")
public class Book {
〜 略 〜
}
            </pre>
            <p style="margin: 0.5em; text-indent: 1em;">
  どちらのクラスも <a href="http://www.mamezou.com/jaxb2/namespace" target="_blank">http://www.mamezou.com/jaxb2/namespace</a> に属すように namespace 属性を定義しました。このクラスから生成される XML スキーマはどのようになっているか、確認してみましょう (適宜改行しています)。</p>
NamespaceSchema.xsd (分かりやすくするために名前を変えています):<br />
            <pre class="code" style="font-size: smaller; width: 80%;">
&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;
&lt;xs:schema version="1.0" targetNamespace="http://www.mamezou.com/jaxb2/namespace"
                         xmlns:tns="http://www.mamezou.com/jaxb2/namespace"
                         xmlns:xs="http://www.w3.org/2001/XMLSchema"&gt;

  &lt;xs:element name="BookOrder" type="tns:bookOrder"/&gt;

  &lt;xs:complexType name="bookOrder"&gt;
    &lt;xs:sequence&gt;
      &lt;xs:element name="Book" type="tns:book" minOccurs="0" maxOccurs="unbounded"/&gt;
    &lt;/xs:sequence&gt;
  &lt;/xs:complexType&gt;

  &lt;xs:complexType name="book"&gt;
    &lt;xs:sequence&gt;
      &lt;xs:choice minOccurs="0"&gt;
        &lt;xs:element name="Title" type="xs:string"/&gt;
        &lt;xs:element name="ISBN" type="xs:string"/&gt;
      &lt;/xs:choice&gt;
      &lt;xs:element name="Category" type="xs:string" default="&#20998;&#39006;&#12394;&#12375;" minOccurs="0"/&gt;
      &lt;xs:element name="Authors" minOccurs="0"&gt;
        &lt;xs:complexType&gt;
          &lt;xs:sequence&gt;
            &lt;xs:element name="Author" type="xs:string" minOccurs="0" maxOccurs="unbounded"/&gt;
          &lt;/xs:sequence&gt;
        &lt;/xs:complexType&gt;
      &lt;/xs:element&gt;
      &lt;xs:element name="Price" type="xs:int"/&gt;
      &lt;xs:element name="Publisher" type="xs:string" default="&#19981;&#26126;" minOccurs="0"/&gt;
      &lt;xs:element name="PublishDate" type="xs:dateTime" minOccurs="0"/&gt;
    &lt;/xs:sequence&gt;
  &lt;/xs:complexType&gt;
&lt;/xs:schema&gt;
            </pre>
            <p style="margin: 0.5em; text-indent: 1em;">
  xs:schema 要素に targetNamespace 属性が追加され、xmlns:tns で名前空間が追加定義されています。つまり、グローバル宣言されたいずれの要素、及び型も <a href="http://www.mamezou.com/jaxb2/namespace" target="_blank">http://www.mamezou.com/jaxb2/namespace</a> 名前空間に属するように定義がされました。それでは、入力 XML データを修正し、それぞれこの名前空間に属するように修正してみましょう。</p>
[in]NamespaceBookOrder.xml:<br />
            <pre class="code" style="font-size: smaller; width: 80%;">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;ns:BookOrder xmlns:ns="http://www.mamezou.com/jaxb2/namespace"&gt;
  &lt;Book&gt;
    &lt;Title&gt;豆蔵セミナーライブオンテキスト(1) わかるオブジェクト指向&lt;/Title&gt;
    &lt;Category&gt;オブジェクト指向&lt;/Category&gt;
    &lt;Authors&gt;
      &lt;Author&gt;山田 隆太&lt;/Author&gt;
    &lt;/Authors&gt;
    &lt;Price&gt;2604&lt;/Price&gt;
    &lt;Publisher&gt;技術評論社&lt;/Publisher&gt;
    &lt;PublishDate&gt;2005-07-29T00:00:00+09:00&lt;/PublishDate&gt;
  &lt;/Book&gt;
  &lt;Book&gt;
    &lt;ISBN&gt;978-4774127392&lt;/ISBN&gt;
    &lt;Category&gt;モデリング&lt;/Category&gt;
    &lt;Authors&gt;
      &lt;Author&gt;岡村 敦彦&lt;/Author&gt;
    &lt;/Authors&gt;
    &lt;Price&gt;2604&lt;/Price&gt;
    &lt;Publisher&gt;技術評論社&lt;/Publisher&gt;
    &lt;PublishDate&gt;2006-04-11T00:00:00+09:00&lt;/PublishDate&gt;
  &lt;/Book&gt;
&lt;/ns:BookOrder&gt;
            </pre>
            <p style="margin: 0.5em; text-indent: 1em;">
  グローバル宣言されている BookOrder 要素のみ <a href="http://www.mamezou.com/jaxb2/namespace" target="_blank">http://www.mamezou.com/jaxb2/namespace</a> 名前空間に属するようにします。Book 要素配下は名前空間に属していないことがわかります。XML スキーマに関する知識がある方は特に説明は不要だと思いますが、XML スキーマでは、デフォルトでは xs:complexType 内でローカル宣言された要素 (xs:element) は名前空間に属さないため、ここでもそのように定義します。</p>
            <p style="margin: 0.5em; text-indent: 1em;">
  それでは実行してみましょう。実行結果は以下の通りです。特に何も変わった点はなく、正常に出力されます。</p>
コンソール出力:<br />
            <pre class="code" style="font-size: smaller; width: 80%;">
タイトル(ISBN) : 豆蔵セミナーライブオンテキスト(1) わかるオブジェクト指向
カテゴリ       : オブジェクト指向
著者           : 山田 隆太
価格(税込)     : 2604
出版社         : 技術評論社
発売日         : 2005/07/29

タイトル(ISBN) : 978-4774127392
カテゴリ       : モデリング
著者           : 岡村 敦彦
価格(税込)     : 2604
出版社         : 技術評論社
発売日         : 2006/04/11

            </pre>

            <h3 style="color: rgb(0, 128, 0);" id="Chapter11.2">
11.2. 異名前空間</h3>
            <p style="margin: 0.5em; text-indent: 1em;">
  次に、異なる名前空間に属するようにしてみましょう。BookOrder クラスはそのままで、Book クラスが <a href="http://www.mamezou.com/jaxb2/namespace/other" target="_blank">http://www.mamezou.com/jaxb2/namespace/other</a> 名前空間に属するように修正してみましょう。</p>
Book.java:<br />
            <pre class="code" style="font-size: smaller; width: 80%;">
〜 package, imports は略 〜

@XmlType(propOrder={"id", "category", "author", "price", "publisher", "publishDate"},
         namespace="http://www.mamezou.com/jaxb2/namespace/other")
public class Book {
〜 略 〜
}
            </pre>
            <p style="margin: 0.5em; text-indent: 1em;">
  それではこのクラス (BookOrder, Book) を基に XML スキーマを生成してみましょう。</p>
コンソール出力:<br />
            <pre class="code" style="font-size: smaller; width: 80%;">
C:\>schemagen BookOrder.java Book.java
注:Writing C:\\schema1.xsd
注:Writing C:\\schema2.xsd
            </pre>
            <p style="margin: 0.5em; text-indent: 1em;">
  2 つのスキーマが出力されました。XML スキーマの仕様では、ひとつの XML スキーマに定義された要素や属性は、必ず同一の名前空間に属している必要があるため、これに準拠して 2 つのスキーマ (定義した名前空間分) が出力されることになります。それでは、schema2.xsd を見ていきましょう (適宜改行しています)。</p>

schema2.xsd:<br />
            <pre class="code" style="font-size: smaller; width: 80%;">
&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;
&lt;xs:schema version="1.0" targetNamespace="http://www.mamezou.com/jaxb2/namespace"
                         xmlns:ns1="http://www.mamezou.com/jaxb2/namespace/other"
                         xmlns:tns="http://www.mamezou.com/jaxb2/namespace"
                         xmlns:xs="http://www.w3.org/2001/XMLSchema"&gt;

  &lt;xs:import namespace="http://www.mamezou.com/jaxb2/namespace/other" schemaLocation="schema1.xsd"/&gt;

  &lt;xs:element name="BookOrder" type="tns:bookOrder"/&gt;

  &lt;xs:complexType name="bookOrder"&gt;
    &lt;xs:sequence&gt;
      &lt;xs:element name="Book" type="ns1:book" minOccurs="0" maxOccurs="unbounded"/&gt;
    &lt;/xs:sequence&gt;
  &lt;/xs:complexType&gt;
&lt;/xs:schema&gt;
            </pre>
            <p style="margin: 0.5em; text-indent: 1em;">
  xs:import 要素を使って、schema1.xsd を読み込んでいることが分かります。xs:import 要素は、異なる名前空間に属する XML スキーマを参照する場合に使用するもので、ここでは <a href="http://www.mamezou.com/jaxb2/namespace/other" target="_blank">http://www.mamezou.com/jaxb2/namespace/other</a> 名前空間に属す schema1.xsd を参照しています。</p>
            <div class="emp" style="font-size: smaller; width: 80%;">
                <p style="text-indent: 1em; margin: 0.5em;">
  <b>Note:</b></p>
                <p style="text-indent: 1em; margin: 0.5em;">
  ここでひとつ注意が必要です。schemagen ツールは、出力する XML スキーマのファイル名を指定することが出来ないため、参照 (import) する XML スキーマのファイル名を変更した場合は、xs:import/@schemaLocation 属性の値も忘れずに変更しなくてはなりません。</p>
            </div>
            <p style="margin: 0.5em; text-indent: 1em;">
  SchemaFactory#newSchema() メソッドでは、親となる方のスキーマ、つまりこの例では schema2.xsd の Schema オブジェクトを生成するよう指示することで、schema1.xsd も同時に読み込まれます。</p>

            <h2 style="color: rgb(0, 128, 0);" id="Chapter12">
12. グローバル宣言された要素を参照してみよう</h2>
            <p style="margin: 0.5em; text-indent: 1em;">
  最後にグローバル宣言された他要素を参照する方法を見ていきましょう。XML スキーマでは &lt;xs:element ref="参照先グローバル要素名" /&gt; で表現される JAXB アノテーションは何でしょう？キーワード的に出てきましたね。そう、@XmlElementRef です。名は体を表す良いネーミングです (これ以外の名前を付けたらおかしいでしょ？という突っ込みは置いておきましょう)。</p>
            <p style="margin: 0.5em; text-indent: 1em;">
  本と言えば A4 版、B5 版などサイズがたくさんあります。では、ここでは縦、横、高さ (厚み) を追加してみます。Size クラスを定義してみましょう。しかし、サイズは何も本に限らず世の中の物質全てに共通するものです。そこで Size 要素を共通要素として定義し、参照するようにしてみます。</p>
            <p style="margin: 0.5em; text-indent: 1em;">
  まず、以下の様に Size クラスを定義します。</p>
Size.java:<br />
            <pre class="code" style="font-size: smaller; width: 80%;">
〜 package, imports は略 〜

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="Size", namespace="http://www.mamezou.com/jaxb2/namespace/common")
@XmlType(propOrder={"length", "width", "height"},
         namespace="http://www.mamezou.com/jaxb2/namespace/common")
public class Size {
    @XmlElement(name="Length")
    private double length;

    @XmlElement(name="Width")
    private double width;

    @XmlElement(name="Height")
    private double height;

    〜 アクセッサは略 〜
}
            </pre>
            <p style="margin: 0.5em; text-indent: 1em;">
  次に Book クラスを修正します。@XmlElementRef を使って size フィールドを定義します。併せて @XmlType の propOrder 属性も修正します。</p>
Book.java:<br />
            <pre class="code" style="font-size: smaller; width: 80%;">

〜 略 〜
@XmlType(propOrder={"id", "category", "author", "price", "publisher", "publishDate", "size"},
         namespace="http://www.mamezou.com/jaxb2/namespace/other")
〜 略 〜

    @XmlElementRef(name="Size", type=Size.class)
    private Size size;
〜 略 〜
            </pre>
            <p style="margin: 0.5em; text-indent: 1em;">
  XML スキーマを作成後、取得したサイズをコンソールに出力するよう、Main.java を修正します (割愛)。最後に XML データを修正します。Size 要素はグローバル要素として定義されているので、名前空間を付与しなくてはならない点に注意してください。</p>
[in]RefBookOrder.xml<br />
            <pre class="code" style="font-size: smaller; width: 80%;">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;ns1:BookOrder xmlns:ns1="http://www.mamezou.com/jaxb2/namespace"
               xmlns:ns2="http://www.mamezou.com/jaxb2/namespace/common"&gt;
  &lt;Book&gt;
    &lt;Title&gt;豆蔵セミナーライブオンテキスト(1) わかるオブジェクト指向&lt;/Title&gt;
    &lt;Category&gt;オブジェクト指向&lt;/Category&gt;
    &lt;Authors&gt;
      &lt;Author&gt;山田 隆太&lt;/Author&gt;
    &lt;/Authors&gt;
    &lt;Price&gt;2604&lt;/Price&gt;
    &lt;Publisher&gt;技術評論社&lt;/Publisher&gt;
    &lt;PublishDate&gt;2005-07-29T00:00:00+09:00&lt;/PublishDate&gt;
    &lt;ns2:Size&gt;
      &lt;Length&gt;21.0&lt;/Length&gt;
      &lt;Width&gt;14.8&lt;/Width&gt;
      &lt;Height&gt;1.8&lt;/Height&gt;
    &lt;/ns2:Size&gt;
  &lt;/Book&gt;
&lt;/ns1:BookOrder&gt;
            </pre>

            <p style="margin: 0.5em; text-indent: 1em;">
  さぁ仕上げです。実行してみましょう。Size 要素に設定した値は正しく取得出来ましたか？取得出来ていれば完成です。(=￣▽￣=)Ｖ</p>
            </td>
        </tr>
        <tr>
            <td align="left"><a href="http://mamezou.net/modules/xfsection/article.php?articleid=110">&lt;&lt;&nbsp;Prev...</a></td>
            <td align="right"><a href="http://mamezou.net/modules/xfsection/article.php?articleid=112">Next...&nbsp;&gt;&gt</a></td>
        </tr>
    </tbody>
</table>
<br />
<table>
    <tbody>
        <tr><td>page 1</td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=109#Chapter1">1. JAXB とは</a></td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=109#Chapter2">2. 必要な環境</a></td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=109#Chapter3">3. 本記事の構成</a></td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=109#Chapter4">4. とりあえず何も考えずに動かしてみよう</a></td></tr>
        <tr><td>page 2</td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=110#Chapter5">5. スキーマ検証をしてみよう</a></td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=110#Chapter6">6. 繰り返し定義をしてみよう</a></td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=110#Chapter7">7. 選択定義をしてみよう</a></td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=110#Chapter8">8. all 定義をしてみよう</a></td></tr>
        <tr><td>page 3</td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=111#Chapter9">9. デフォルト値を設定してみよう</a></td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=111#Chapter10">10. 固定値を設定してみよう</a></td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=111#Chapter11">11. 名前空間を設定してみよう</a></td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=111#Chapter12">12. グローバル宣言された要素を参照してみよう</a></td></tr>
        <tr><td>page 4</td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=112#Chapter13">13. Ant から schemagen ツールを実行してみよう</a></td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=112#Chapter14">14. XML スキーマから Java オブジェクトを生成してみよう</a></td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=112#End">おわりに</a></td></tr>
    </tbody>
</table>
      ]]>
    </content>
      </entry>
    <entry>
    <title>JAXB2でXMLデータバインディング(4)</title>
    <link rel="alternate" type="text/html" href="http://mamezou.net/modules/xfsection/article.php?articleid=112" />
    <modified>2008-03-05T10:42:16+09:00</modified>
    <issued>2008-02-28T11:30:29+09:00</issued>
    <id>tag:sv20.xserverzero.net,2008://1.7.112</id>
        <created>2008-02-28T11:30:29+09:00</created>
            <summary type="text/plain">                                                JAXB 2 で XML データバインディング (4)                  株式会社 豆蔵 五味 和人                  13. Ant から schemagen ツールを実行してみよう                13.1. 必要な環境                         ...</summary>
        <author>
      <name>mameadm</name>
                </author>
        <dc:subject>技術記事</dc:subject>
            <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://sv20.xserverzero.net/~x2020294/">
      <![CDATA[
      <table border="0" cellpadding="2" cellspacing="1" width="100%"> 
   <tbody>
        <tr>
            <td class="xfartcle" width="100%">
                <h1 style="color: rgb(0, 128, 0);">JAXB 2 で XML データバインディング (4)</h1>
                株式会社 豆蔵 五味 和人<br />

            <h2 style="color: rgb(0, 128, 0);" id="Chapter13">
13. Ant から schemagen ツールを実行してみよう</h2>
            <h3 style="color: rgb(0, 128, 0);">
13.1. 必要な環境</h3>
            <ul>
                <li>
  JAXB 2</li>
                <p style="margin: 0.5em; text-indent: 1em;">
  schemagen ツールを Ant で実行するために使用します。本記事では JAXB 2.1.6 を使用します。</p>
                <ol><li>
  <a href="https://jaxb.dev.java.net/2.1.6/" target="_blank"><a href="https://jaxb.dev.java.net/2.1.6/" target="_blank">https://jaxb.dev.java.net/2.1.6/</a></a> から JAXB2_20071219.jar をダウンロードします。</li>
                <li>
  コマンドプロンプトを開いて、java -jar JAXB2_20071219.jar (パスは環境に合わせて適宜変更してください) と入力するか、ダブルクリックします。</li>                <li>
  「License Agreement」ダイアログが表示されたら、(ライセンス規約を確認しながら) 垂直スクロールバーを一番下まで引っ張ります。</li>
                <li>
  Accept ボタンが有効になるので押下します。</li>
                <li>
  解凍後、作成されたフォルダを適当な場所に配置します。</li>
                </ol>
                <li>
  Ant</li>
                <p style="margin: 0.5em; text-indent: 1em;">
  本記事では 1.7.0 を使用します。</p>
                <ol><li>
  <a href="http://ant.apache.org/bindownload.cgi" target="_blank"><a href="http://ant.apache.org/bindownload.cgi" target="_blank">http://ant.apache.org/bindownload.cgi</a></a> から apache-ant-1.7.0-bin.zip をダウンロードします。</li>
                <li>
  ダウンロードしたファイルを解凍し、適当な場所に配置します。</li>
                <li>
  環境変数 (ANT_HOME) に ${インストールフォルダ} を、環境変数 (path) に %ANT_HOME%\bin を設定します。</li>
                </ol>
            </ul>
            <h3 style="color: rgb(0, 128, 0);">
13.2. build.xml ファイルの作成</h3>
            <p style="margin: 0.5em; text-indent: 1em;">
  Ant で使用する build.xml ファイルを作成します。筆者環境での build.xml ファイルを以下に示します。必要に応じてパスを変更してください。ここでは <a href="http://mamezou.net/modules/xfsection/article.php?articleid=111#Chapter11.2">11.2. 異名前空間</a> で作成したプログラムから XML スキーマを作成してみます。</p>
build.xml:<br />
            <pre class="code" style="font-size: smaller; width: 80%;">
&lt;?xml version="1.0" encoding="Shift_JIS" ?&gt;
&lt;project default="compile" basedir="."&gt;
    &lt;taskdef name="schemagen" classname="com.sun.tools.jxc.SchemaGenTask"&gt;
        &lt;classpath&gt;
            &lt;fileset dir="C:/jaxb-ri-20071219/lib" includes="*.jar" /&gt;
        &lt;/classpath&gt;
    &lt;/taskdef&gt;

    &lt;target name="compile"&gt;
        &lt;echo message="Generating schemas..." /&gt;
        &lt;schemagen destdir="C:/"&gt;
            &lt;src path="C:/eclipse_europa/workspace/Jaxb Sample/src/com/mamezou/jaxb2/namespace/other" /&gt;
            &lt;exclude name="Main.java"/&gt;
            &lt;schema namespace="http://www.mamezou.com/jaxb2/namespace" file="BookOrder.xsd" /&gt;
            &lt;schema namespace="http://www.mamezou.com/jaxb2/namespace/other" file="Book.xsd" /&gt;
        &lt;/schemagen&gt;
    &lt;/target&gt;
&lt;/project&gt;
            </pre>
            <h3 style="color: rgb(0, 128, 0);">
13.3. Ant の実行</h3>
            <p style="margin: 0.5em; text-indent: 1em;">
  それでは、コマンドプロンプトを開いて Ant を実行してみましょう (build.xml ファイルは C:\ に配置しています)。コンソール出力は以下の様になります。</p>
コンソール出力:<br />
            <pre class="code" style="font-size: smaller; width: 80%;">
C:\>ant
Buildfile: build.xml

compile:
     [echo] Generating schemas...
[schemagen] Generating schema from 2 source files
[schemagen] 注:Writing C:\Book.xsd
[schemagen] 注:Writing C:\BookOrder.xsd

BUILD SUCCESSFUL
Total time: 4 seconds
            </pre>
            <p style="margin: 0.5em; text-indent: 1em;">
  指定したファイル名でスキーマが生成されました。schemagen ツールを直接実行した場合、スキーマファイル名を指定出来ないため、開発現場では Ant (もしくは Maven) を使用する方が良いでしょう。</p>

            <h2 style="color: rgb(0, 128, 0);" id="Chapter14">
14. XML スキーマから Java オブジェクトを生成してみよう</h2>
            <p style="margin: 0.5em; text-indent: 1em;">
  これまで、Java オブジェクトにアノテーションを付与し、schemagen ツールを用いて XML スキーマを自動生成する方法を見てきました。では、今度は逆に『xjc』ツールを用いて XML スキーマから Java オブジェクトを生成してみましょう。これは JAXB 1.x 系で用いられていた方法でもあります。</p>
            <p style="margin: 0.5em; text-indent: 1em;">
  ここでは、既に作成した <a href="http://mamezou.net/modules/xfsection/article.php?articleid=110#Chapter6.2" target="_blank"> SequenceSchema.xsd (link)</a> から Java オブジェクトを生成してみましょう。</p>
            <p style="margin: 0.5em; text-indent: 1em;">
  コマンドプロンプトを開いて、以下のコマンドを入力し実行してください。</p>
            <div class="emp" style="font-size: smaller; width: 80%;">
                <p style="text-indent: 1em; margin: 0.5em;">
  <b>C:\>xjc SequenceSchema.xsd (パスは環境に合わせて適宜変更してください)</b></p>
            </div>
            <p style="margin: 0.5em; text-indent: 1em;">
  カレントフォルダ (ここでは C:\) に generated フォルダが作成され、その中に Java ファイルが出力されていると思います。ここで特に注目すべき点は、生成されるファイル数の少なさです。バインディング対象のクラスとなる BookOrder.java と Book.java を除いて、JAXB 2 用に生成されるファイルは ObjectFactory.java のみです。</p>
            <p style="margin: 0.5em; text-indent: 1em;">
  本記事の最初で述べたように、JAXB 1.x 系の xjc ツールでは、ランタイムなど全て含めて 40 ファイル (ランタイムを除いても 10 ファイル) 生成されていたので、随分進歩したと言えます。</p>
            <p style="margin: 0.5em; text-indent: 1em;">
  さきに、『アノテーションでは minOccur 属性や maxOccurs 属性に、2, 3 など自由な値を設定することが出来ない。』と解説しました。そして、『自動生成した XML スキーマを修正することは賛否両論。』だとも解説しました。筆者自身も自動生成したものに手修正を加えることは反対です。XML スキーマを再生成するたびに修正を加えることは現実的ではありません (スクリプトで実施したとしても)。</p>
            <p style="margin: 0.5em; text-indent: 1em;">
  筆者は JAXB 1.x 系を使用していたので、XML スキーマの仕様もある程度理解していますし、堅いスキーマ定義をすることで入力データチェックをアプリケーションに組み込まなくても良いのが大きな魅力だと感じています。そんなことをするくらいなら、いっそ XML スキーマから Java オブジェクトを生成出来るように XML スキーマの学習をお勧めします。</p>
            <p style="margin: 0.5em; text-indent: 1em;">
  XML スキーマの仕様をある程度理解している方は、『XML スキーマ⇒Java オブジェクト』変換を採用する方が、ストレスなく効率的に実装が出来るのではないでしょうか。</p>

            <h2 style="color: rgb(0, 128, 0);" id="End">
おわりに</h2>
            <p style="margin: 0.5em; text-indent: 1em;">
  ここまで、基本的なスキーマ定義を中心に JAXB 2 の機能を見てきました。JAXB 2 を知ることで DOM や SAX, StAX などの仕様は全くと言っていいほど意識する必要性がなくなりました。時折、<b>『JAXB 2 では XML スキーマの知識が必須でなくなる』</b>と耳にすることがありますが、(あくまで) 個人的な意見としてはそれは誤りであるかのように思います。いくら Java オブジェクトから XML スキーマを生成出来るからと言って、XML スキーマの知識がなければアノテーションを適切に定義することも出来ませんし、何が出来て、何が出来ないかを把握することも出来ません。</p>
            <p style="margin: 0.5em; text-indent: 1em;">
  さきでも解説した通り、@XmlElement や @XmlElementRef では、minOccurs 属性や maxOccurs 属性に固定値を指定することも出来ません。XML スキーマに慣れている開発者にとってはこれが大きな問題のようにも思えます。その場合は、『xjc ツールを利用して XML スキーマから Java クラスを生成する』と言った方法で回避することになるでしょう (または JAXB 2 の仕様が拡張されるまで待つしかありません)。</p><br />
            <p style="margin: 0.5em; text-indent: 1em;">
  JAXB 2 は非常に優れた強力な XML バインダであり、JAX-WS 2 にも採用されているなどスタンダードな機能です。Jakarta Commons Digester や Castor など、他にも優れた XML バインダは数多くありますが、Java 標準である JAXB 2 は、他の XML バインダに負けないほどの機能を持っています。</p>
            <p style="margin: 0.5em; text-indent: 1em;">
  本記事をご覧になられて、アーキテクチャ選定の際に、『JAXB 2 を使用する手もあるな』と思い出して頂けたり、『JAXB 1.x 系ではパフォーマンスに問題が』と感じていた方が再度、JAXB を試して頂く機会になれば幸いです。</p>
            <div class="emp" style="font-size: smaller; width: 80%;">
                <p style="text-indent: 1em; margin: 0.5em;">
  <b>Note:</b></p>
                <p style="text-indent: 1em; margin: 0.5em;">
  WSIT (Web Services Interoperability Technologies (Sun Mycrosystems 社と Microsoft 社間で進めている、Web サービスの相互運用に関する取り組み)) を考慮する場合は、いくつか制約事項があります。<a href="http://msdn2.microsoft.com/ja-jp/library/ms733112.aspx" target="_blank"><a href="http://msdn2.microsoft.com/ja-jp/library/ms733112.aspx" target="_blank">http://msdn2.microsoft.com/ja-jp/library/ms733112.aspx</a></a> 内で、『禁止』と記載されている要素や属性は使用しない方が無難かも知れません (現に、<a href="http://docs.sun.com/app/docs/doc/820-1072/ahigx?l=ja&a=view" target="_blank"><a href="http://docs.sun.com/app/docs/doc/820-1072/ahigx?l=ja&a=view" target="_blank">http://docs.sun.com/app/docs/doc/820-1072/ahigx?l=ja&a=view</a></a> では xs:all の使用は推奨されていません)。</p>
            </div>
            </td>
        </tr>
        <tr>
            <td align="left"><a href="http://mamezou.net/modules/xfsection/article.php?articleid=111">&lt;&lt;&nbsp;Prev...</a></td>
        </tr>
    </tbody>
</table>
<br />
以上 <br />
<br />
<table>
    <tbody>
        <tr><td>page 1</td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=109#Chapter1">1. JAXB とは</a></td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=109#Chapter2">2. 必要な環境</a></td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=109#Chapter3">3. 本記事の構成</a></td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=109#Chapter4">4. とりあえず何も考えずに動かしてみよう</a></td></tr>
        <tr><td>page 2</td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=110#Chapter5">5. スキーマ検証をしてみよう</a></td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=110#Chapter6">6. 繰り返し定義をしてみよう</a></td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=110#Chapter7">7. 選択定義をしてみよう</a></td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=110#Chapter8">8. all 定義をしてみよう</a></td></tr>
        <tr><td>page 3</td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=111#Chapter9">9. デフォルト値を設定してみよう</a></td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=111#Chapter10">10. 固定値を設定してみよう</a></td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=111#Chapter11">11. 名前空間を設定してみよう</a></td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=111#Chapter12">12. グローバル宣言された要素を参照してみよう</a></td></tr>
        <tr><td>page 4</td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=112#Chapter13">13. Ant から schemagen ツールを実行してみよう</a></td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=112#Chapter14">14. XML スキーマから Java オブジェクトを生成してみよう</a></td></tr>
        <tr><td>&nbsp;&nbsp;<a href="http://mamezou.net/modules/xfsection/article.php?articleid=112#End">おわりに</a></td></tr>
    </tbody>
</table>
      ]]>
    </content>
      </entry>
    <entry>
    <title>2/26に豆ナイトを開催します　お題「怪盗Ruby vs. Scala座の怪人」</title>
    <link rel="alternate" type="text/html" href="http://mamezou.net/modules/news/article.php?storyid=23" />
    <modified>2008-02-13T15:23:55+09:00</modified>
    <issued>2008-02-13T15:23:55+09:00</issued>
    <id>tag:sv20.xserverzero.net,2008://1.11.10</id>
            <summary type="text/plain">2月26日に豆ナイトを開催します。  今回はポストJavaとして注目を集めるプログラム言語Scalaについて、羽生田が講演します。    お申し込み方法や、詳細はこちらから  http://www.mamezou.net/modules/mamenight1/</summary>
        <author>
      <name>Mamezou</name>
                </author>
        <dc:subject>ニュース</dc:subject>
            <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://sv20.xserverzero.net/~x2020294/">
      <![CDATA[
      2月26日に豆ナイトを開催します。
今回はポストJavaとして注目を集めるプログラム言語Scalaについて、羽生田が講演します。

お申し込み方法や、詳細はこちらから
http://www.mamezou.net/modules/mamenight1/
      ]]>
    </content>
      </entry>
  </feed>