XML Schema と Javaクラス

Download Report

Transcript XML Schema と Javaクラス

第11回 2007年7月6日



「XMLパーサ」-- Java でXMLを処理
javax.xml.stream パッケージのパーサ
SAX(Simple API for XML) のパーサ
DOM(Document Object Model)のパーサ
パーサの応用 :
検索,フィルタ的な処理 、視覚化
パーサの上位のサービス
XPath -- XML文書内の検索
XSLT – XML文書の変換
スキーマ言語と妥当性の検証
XPath (6/15)
XSLT (6/22)
 名前空間(Namespace) (6/22)
 XML文書の妥当性の検証(6/29)
XML Schema
 JAXB (7/6, 7/13)
 SOAP, Webサービ(7/20)
 試験(7/27)




JAXB
JavaとXMLの変換のフレームワーク)
XJC
新しいJDKのツール
スキーマをJavaのクラスに自動変換
整形
XMLとして正しい形式か?
 妥当性
データの内容として目的どおりか?
 妥当性の検証には「設計図」が必要
スキーマ言語

<World>
<Japan><Wakkanai/>
<China><USA>
</China></USA>
</World>
*org.xml.sax.ErrorHandler
fatalError() として処理
<World>
<Asia>
<Japan></Japan>
<England></England>
</Asia>
<USA> <China></China></USA>
</World>
*org.xml.sax.ErrorHandler error()メソッド
スキーマ言語
– XML文書のルールを定める
DTD (document type definition)
XML Schema
W3C XML Schema
RELAX NG
Schematron







優れた表現力
厳密な定義
豊富なデータ型
名前空間の利用
それ自身がXMLである!
事実上の標準規格
<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>
<xsd:schema xmlns:xsd
="http://www.w3.org/2001/XMLSchema">
 W3C XML Schema であることを示すURI
以下、プレフィックス xsd: で表現
:
:
<xsd:element name="first" type="xsd:string"/>
<xsd:element name=“last" type="xsd:string"/>
 要素を定義,名前は”first”, 型は文字列
 要素を定義,名前は “last”, 型は文字列
<xsd:element name="name“ type="nameType"/>
 要素を定義,名前は”name” ,型は”nameType”
<xsd:complexType name="nameType">
:
:
</xsd:complexType>
 複雑な型の内容を定義、名前は “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>
 複雑な型 “nameType” の内容
以下のものが順に出現(sequence)
要素 first
要素 last
<xsd:complexType name="peopleType">
<xsd:sequence>
<xsd:element name="name"
type="nameType" minOccurs="1"
maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="nameType">
<xsd:sequence>
<xsd:element name="first"
type="xsd:string"/>
<xsd:element name="middle"
type="xsd:string" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
何回でも自由(省略も可)
minOccurs=“0“ maxOccurs="unbounded“
 何回でも自由(省略は不可=最低1回)
minOccurs=“1“ maxOccurs="unbounded“
 1回か省略(最大1回)
minOccurs=“0“ maxOccurs=“1“
 1回のみ(省略は不可)-- デフォルト値
minOccurs=“1“ maxOccurs=“1“

*min, max とも省略されると値1と解釈
SchemaFactory sf
= SchemaFactory.newInstance(
"http://www.w3.org/2001/XMLSchema" );
Schema schema
= sf.newSchema(
new StreamSource( args[0] ) );
try {
Validator validator
= schema.newValidator();
validator.validate(
new StreamSource( args[1] ) );
}
catch( Exception e ) { }
*妥当でない場合には例外が発生


例外を直接処理 (catch ブロック内で)
エラーハンドラに処理を渡す
MyErrorHandler ehandler
= new MyErrorHandler();
validator.setErrorHandler( ehandler );
*妥当でない – error() メソッドを呼ぶ
(整形でない場合は fatalError() )




JAXB(Java architecture for XML Binding)
Java と XML とのマッピングを提供
新しい Webサービスを支える基礎技術
アノテーションをフルに活用
Java のクラスとインスタンス
public class Name {
String first;
String last;
}
--------------------------------------------------Name name = new Name();
name.first=“Tatsuo”; name.last=“Ueda”;

XMLのドキュメント
<nama>
<first>Tatsuo</fist>
<last>Ueda</last>
</name>

要素<name> -- インスタンス name
要素<first>,<last> -- フィールドに対応
インスタンスは個々の XML文書に対応
 クラスの定義は?
 XML文書の定義はスキーマ言語
DTD(Document Type Definition)
XML Schema
W3C XML Schema
RELAX NG
Schematron

<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>

String first;
public String getFirst() { returen first; }
public void setFirst( String s ) { first = s; }

<xsd:element name="first"
type="xsd:string"/>

基本は 「フィールド(プロパティ)要素」
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>

<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の要素
(より正確にはプロパティ、属性のケース
も)



xjc ( XML to Java compiler )
W3C XML Schema 定義ファイルを
Java のクラス定義に
xjc name.xsd
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="name" type="Name"/>
<xsd:complexType name="Name">
<xsd:sequence>
<xsd:element name="first" type="xsd:string"/>
<xsd:element name="last" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
package generated;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType( name = "Name",
propOrder ={ "first", "last" } )
public class Name {
:
:

「プロパティ」とフィールド
@XmlElement(required = true)
protected String first;
@XmlElement(required = true)
protected String last;

getter と setter も生成
public String getFirst() {
return first;
}
public void setFirst( String value) {
this.first = value;
}