Javaから XML Schemaへ

Webサービス (第2回)
2007年10月3日
「WebサービスII」の内容


第2世代のWebサービス
Java SE 6 の標準
アノテーションの利用
アプリケーションサーバ Glassfish
EoD(Ease of Development)
移行期のため今年度3年前期の「応用
Java」と内容の一部が重複(JAXB)
この時間の目標





JAXBとは?(復習)
ツール schemagen
Java のクラスからXML Schema を自動生成
XMLの文書 Javaのインスタンス
Javaのアノテーション
アノテーションとJAXB
JAXB




JAXB(Java architecture for XML Binding)
Java と XML とのマッピングを提供
新しい Webサービスを支える基礎技術
アノテーションをフルに活用
Java SE 6 で追加-- JAXB

javax.xml.bind
javax.xml.bind.annotation
javax.xml.bind.annotation.adapters
javax.xml.bind.attachment
javax.xml.bind.helpers
javax.xml.bind.util
Java と XML(1)
Java のクラスとインスタンス
public class Name {
String first;
String last;
}
--------------------------------------------------Name name = new Name();
name.first=“Tatsuo”; name.last=“Ueda”;

Java と XML(2)

XMLのドキュメント
<nama>
<first>Tatsuo</fist>
<last>Ueda</last>
</name>
要素<name> -- インスタンス name
要素<first>,<last> -- フィールドに対応
Java と XML(3)



インスタンスは個々の XML文書に対応
クラスの定義は?
XML文書の定義はスキーマ言語
DTD(Document Type Definition)
XML Schema
W3C XML Schema
RELAX NG
Schematron
XML Schema の例(1)
<xsd:schema xmlns:xsd
="http://www.w3.org/2001/XMLSchema">
<xsd:element name="name" type="nameType"/>
<xsd:complexType name="nameType">
<xsd:sequence>
<xsd:element name="first" type="xsd:string"/>
<xsd:element name="last" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
Java との比較(1)


String first;
public String getFirst() { returen first; }
public void setFirst( String s ) { first = s; }
<xsd:element name="first"
type="xsd:string"/>
Java との比較(2)


public class name { … }
<xsd:element
name="name“ type="nameType"/>
<xsd:complexType name="nameType">
:
String first; String last;
<xsd:sequence>
<xsd:element name="first" type="xsd:string"/>
<xsd:element name="last" type="xsd:string"/>
</xsd:sequence>
XML Schema の例(2)
<xsd:complexType name="peopleType">
<xsd:sequence>
<xsd:element name="name"
type="nameType" minOccurs="1"
maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
対応のまとめ




Java言語 < -- > W3C XML Schema
Java のクラス < -- > スキーマ定義ファイ
ル
Java のインスタンス < -- > XML文書
Java のプロパティ < -- > XMLの要素
新しい ツール(1) xjc


xjc ( XML to Java compiler )
W3C XML Schema 定義ファイルを
Java のクラス定義に
xjc name.xsd
新しい ツール(2) schemagen


schemagen( schema generater )
Javaのクラス定義を
W3C XML Schema 定義ファイルに
schemagen person/*.java
デフォルト名で schema1.xsd が生成
Javaクラスからスキーマを生成


サンプルでは
person.Person.java , person.Name.java
パッケージ person を指定
(=格納されるディレクトリ名)
person.Name.java
package person; import
javax.xml.bind.annotation.*;
@XmlType
public class Name {
public String first;
public String last;
}
person.Person.java
package person; import
javax.xml.bind.annotation.*;
@XmlRootElement
public class Person {
public Name name;
public String address;
}
自動生成される schema1.xsd
<xs:complexType name="name">
<xs:sequence>
<xs:element name="first"
type="xs:string" minOccurs="0"/>
<xs:element name="last"
type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
schema1.xsd のつづき
<xs:complexType name="person">
<xs:sequence>
<xs:element name="address"
type="xs:string" minOccurs="0"/>
<xs:element name="name"
type="name" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
アノテーションの例(要素の性質)

@XmlElement アノテーション
個々の要素の性質(デフォルト値など)
@XmlElement( defaultValue=“0” )
public int x;
生成される schema1.xsd
<xs:complexType name="point">
<xs:sequence>
<xs:element name="x"
type="xs:int" default="0"/>
<xs:element name="y"
type="xs:int" default="0"/>
</xs:sequence>
</xs:complexType>
アノテーションの例(属性に変換)

@XmlAttribute アノテーション
public class Point {
@XmlAttribute
public int x;
@XmlAttribute
pulbic int y;
}
生成される XML Schema
<xs:complexType name="point">
<xs:sequence/>
<xs:attribute name="x" type="xs:int"
use="required"/>
<xs:attribute name="y" type="xs:int"
use="required"/>
</xs:complexType>
対応するXML文書の表現
<point>
<x>0</x>
<y>1</y>
</point>
ではなく、
<point x=“0” y=“1” />