SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Cyber Luxeonで学ぶXMLDB入門

XMLDBとJavaAPI、JAXB2.0を活用したWebアプリケーション開発(APIチュートリアル編)

Cyber Luxeonで学ぶXMLDB入門 第5回

JAXBアノテーション

 JAXBの主要クラスの説明に続いてJAXB 2.0から追加されたJAXBアノテーションについて説明します。JAXB 2.0以前は、JAXBを用いたアプリケーションの開発過程の中で、XMLの構造を定義したXMLSchemaファイルを必ず作成する必要があり、敷居がやや高いというデメリットがありました。しかしJAXB 2.0からは、JAXBアノテーションをJavaクラスに定義することで、JavaクラスとXMLの関連付けが容易に可能になり、XMLSchemaファイルの作成も必須ではなくなりました。ここではjavax.xml.bind.annotationパッケージに定義されている32のアノテーションのうち、最も頻繁に使用するであろうアノテーション(XmlRootElement、XmlType、XmlElement、XmlAttribute)について説明します。

JavaクラスとXMLルート要素の関連付け(XmlRootElement)

 JavaトップクラスとXMLのルート要素を関連付けるには、@XmlRootElementを使用します。クラス名とXMLのルート要素の名前が異なる場合は、@XmlRootElementname属性にXMLのルート要素名を指定します。以下に@XmlRootElementを定義したソースを示します。

ルート要素アノテーション定義
import javax.xml.bind.annotation.XmlRootElement;
// ~省略
@XmlRootElement(name="item")
public class Item{

 @XmlRootElementで定義したルート要素は、XMLSchemaのxs:element(ルート要素)に対応します。以下に上記Javaソースに対応するXMLSchemaの定義を示します。

@XmlRootElementに対応するXMLSchema
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="item" type="item"/>
</xs:schema>

要素並び順の定義(XmlType)

 XML要素の並び順を定義するには、@XmlTypeを使用します。@XmlTypeはXMLSchemaの「xs:complexType(複合型)」とマッピングします。@XmlTypeは、@XmlRootElem@XmlAccessorOrder@XmlAccessorType@XmlEnumのアノテーションとセットで使用することができます。

 以下がXmlRootElementとXmlTypeを使用して要素の並び順を定義したサンプルソースです。

要素並び順アノテーション定義
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
// ~省略
@XmlRootElement(name="item")
@XmlType(propOrder={ "itemName", "price" })
public class Item {

    @XmlElement(name="item_name")
    public String getItemName() {
        return itemName;
    }
    @XmlElement(name="price")
    public int getPrice() {
        return price;
    }
}

 @XmlTypeで定義する並び順は、XMLSchemaのxs:sequenceに対応します。以下に上記Javaソースに対応するXMLSchemaの定義を示します。

@XmlTypeに対応するXMLSchema
<xs:complexType name="item">
  <xs:sequence>
    <xs:element name="item_name" type="xs:string"/>
    <xs:element name="price" type="xs:int"/>
  </xs:sequence>

Javaクラスのインスタンス変数とXML要素の関連付け(XmlElement)

 Javaクラスのインスタンス変数とXMLの要素を関連付けるには、@XmlElementを使用します。@XmlTypeはXMLSchemaの「xs:element」とマッピングします。Javaクラスのインスタンス変数名とXMLの要素名が異なる場合には、name属性を使用することによって関連付けることができます。また、インスタンス変数の型によって、マッピングされるXML要素の型も決定されます。例えば、インスタンス変数の型がStringの場合は、xs:stringintの場合はxs:intjava.util.Dateの場合はxs:dateTimeにそれぞれマッピングされます。

要素アノテーション定義
import javax.xml.bind.annotation.XmlElement;
// ~省略
@XmlElement(name="item_name",nillable=true, required=true)
public String getItemName() {
    return itemName;
}
// publicのインスタンス変数に定義することもできる
@XmlElement(name="pref_name")
public String prefName;

 @XmlElementの定義は、XMLSchemaのxs:elementに対応しますが、アノテーションの丸カッコ内に属性を定義することによってxs:elementの属性値を明示的に設定することができます。以下の表に@XmlElementの属性とxs:elementの属性の対応、省略時のデフォルト値をまとめました。

@XmlElementの属性とxs:elementの属性の対応
@XmlElementの属性xs:elementの属性説明省略時のXMLSchema上の属性デフォルト値
namenameXML要素名Javaクラスのインスタンス変数名
defaultValuedefault要素のデフォルト値null
typetype要素のデータ型Javaクラスのインスタンス変数のクラスにマッピングした型(XMLSchemaのビルトインデータ型、もしくは作成したクラス)
namespacenamespace要素が属する名前空間名空値
requiredminOccurs要素の繰り返し回数1

 以下に上記Javaソースに対応するXMLSchemaの定義を示します。

@XmlElementに対応するXMLSchema
<xs:element name="item_name" type="xs:string" nillable="true"/>
<xs:element name="pref_name" type="xs:string" minOccurs="0"/>

Javaクラスのインスタンス変数とXML属性の関連付け(XmlAttribute)

 Javaクラスのインスタンス変数とXMLの属性を関連付けるには、@XmlAttributeを使用します。Javaクラスのインスタンス変数名とXMLの属性名が異なる場合には、name属性を使用することによって関連付けることができます。属性の場合も要素と同じくJavaクラスのインスタンス変数の型によって、マッピングされるXML要素の型が決定されます。

属性アノテーション定義
import javax.xml.bind.annotation.XmlAttribute;
// ~省略
@XmlAttribute(name="item_code")
public String getItemCode() {
    return itemCode;
}

 @XmlAttributeの定義は、XMLSchemaのxs:attributeに対応しますが、アノテーションの丸カッコ内に属性を定義することによってxs:attributeの属性値を明示的に設定することができます。以下の表に@XmlAttributeの属性とxs:attributeの属性の対応をまとめました。

@XmlAttributeの属性とxs:attributeの属性の対応
@XmlAttributeの属性xs:attributeの属性説明省略時のXMLSchema上の属性デフォルト値
namenameXML要素名Javaクラスのインスタンス変数名
namespacenamespace属性が属する名前空間名空値
requireduse属性を必ず使用するか、任意かoptional

 以下に上記Javaソースに対応するXMLSchemaの定義を示します。

@XmlAttributeに対応するXMLSchema
<xs:attribute name="item_code" type="xs:string" use="required"/>

XMLのラッパー要素定義

 XMLのラッパー要素とは、XML要素をひとくくりにするために使用される要素です。主に同じ要素が繰り返される場合に、その繰り返し要素をある親要素で囲むような場合に使用されます。Javaクラスの属性にラップされる要素(サンプルではoption)の@XmlElementの記述とセットで@XmlElementWrapper(サンプルで対応する要素はoptions)を指定します。繰り返しの要素は、Javaクラス上では配列やListなどで表現されます。

属性アノテーション定義
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
// ~省略
@XmlElementWrapper(name="options")
@XmlElement(name="option")
public List<String> getOptions() {
    return options;
}

 @XmlElementWrapperの定義は、XMLSchemaのxs:elementxs:complexTypeの組み合わせに対応します。以下に上記Javaソースに対応するXMLSchemaの定義を示します。

@XmlElementWrapperに対応するXMLSchema
<xs:element name="options" minOccurs="0">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="option"
                type="xs:string" maxOccurs="unbounded" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

 また、上記XMLSchemaのXML要素の例を以下に示します。option要素がoptions要素で囲まれています。

@XmlElementWrapperに対応するXML要素の例
<options>
    <option>L</option>
    <option>M</option>
</options>

XMLスキーマファイルの出力

 JDK 6に標準で付属しているschemagenというツールを使用して、XMLスキーマファイルを出力することができます。なお、スキーマファイルを使用しなくても、サンプルアプリケーションは実行できます。アプリケーション内でXMLバリデーションを実行する場合は、schemagenで生成したファイルを使用すると良いでしょう。

 schemagenは以下の方法で実行します。

cd ソースフォルダ
schemagen -cp jp\beproud\sample\ecitem\entity\*.java

 カレントフォルダにファイルが作成されると、以下のメッセージが出力されます。

注:Writing schema1.xsd

 schemagenで出力したXMLSchemaファイルの例については次回、サンプルアプリケーションのクラス定義に基づいて作成されたファイルを掲載します。

次のページ
Cyber Luxeon Java API

この記事は参考になりましたか?

Cyber Luxeonで学ぶXMLDB入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 佐藤 治夫 (株式会社ビープラウド)(サトウ ハルオ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1401 2007/06/26 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー