270 likes | 410 Views
第10回 2007 年 6 月 29 日. 応用 Java (Java/XML). 前回までやったこと. 「 XML パーサ」 -- Java で XML を処理 javax.xml.stream パッケージのパーサ SAX(Simple API for XML) のパーサ DOM(Document Object Model) のパーサ パーサの応用 : テーブルの利用 , フィルタ的な処理 DOM ツリーの検索、視覚化 パーサの上位のサービス XPath -- XML 文書内の検索
E N D
第10回 2007年6月29日 応用Java (Java/XML)
前回までやったこと • 「XMLパーサ」-- Java でXMLを処理 javax.xml.stream パッケージのパーサ SAX(Simple API for XML) のパーサ DOM(Document Object Model)のパーサ パーサの応用 : テーブルの利用,フィルタ的な処理 DOMツリーの検索、視覚化 • パーサの上位のサービス 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)
本日(6/29)の講義内容 • XML文書の設計と「妥当性」 • W3C XML Schema とは? • 妥当性の検証のAPI javax.xml.validation
復習:整形(Well Formed)文書 • 要素は開始タグと終了タグ <abc> This is a pen. </abc> <img src=“java.png” /> • 要素は階層的な親子関係 <abc></abc><efg></efg> ○ <abc><efg></efg></abc> ○ <abc><efg></abc></efg> × • 全体は単独の要素で囲まれる (Document Type )
整形ではない例(1) <World> <Japan> <China> <USA> </World>
整形ではない例(2) <World> <Japan><Wakkanai/></Japan> <China><USA> </China></USA> </World>
整形ではない例(3) <Asia> <Japan></Japan> <China></China> </Asia> <USA> </USA>
整形だが正しいか? <World> <Asia> <Japan></Japan> <England></England> </Asia> <USA> <China></China></USA> </World>
整形な文書は形式的な「正しさ」 • XML文書の目的に沿う「正しさ」は別 • 「妥当性(Valid)」の概念 • 「妥当」であることをどう定めるか? 要素の名前 出現順序、出現回数 親子関係のルール 属性の名前、許される値
XML文書の設計とスキーマ言語 • スキーマ言語 – XML文書のルールを定める DTD (document type definition) XML Schema W3C XML Schema RELAX NG Schematron
DTD について • DTD( Document Type Definition) • XMLのルールを記述する専用言語 • XML誕生当時の「スキーマ言語」 • 表現力の制約、名前空間の制約 • XMLとは全く異なる文法 <!DOCTYPE name [<!ELEMENT name (first, last)> <!ELEMENT first (#PCDATA)> <!ELEMENT last (#PCDATA)>] >
W3C XML Schema の特徴 • 優れた表現力 • 厳密な定義 • 豊富なデータ型 • 名前空間の利用 • それ自身がXMLである! • 事実上の標準規格
XML Schema の例 <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>
Schema の解説(1) <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”, 型は文字列
Schemaの解説(2) <xsd:element name="name“ type="nameType"/> • 要素を定義,名前は”name” ,型は”nameType” <xsd:complexType name="nameType"> : : </xsd:complexType> • 複雑な型の内容を定義、名前は “nameType”
Schemaの解説(3) <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
XML Schema の例(2) <xsd:complexType name="peopleType"> <xsd:sequence> <xsd:element name="name" type="nameType" minOccurs="1" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType>
XML Schema の例(3) <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と解釈
少し複雑な schema の表現 <xsd:sequence> <xsd:element name="title" type="xsd:string" minOccurs="0"/> <xsd:choice minOccurs="0“ maxOccurs="unbounded"> <xsd:element name="text" type="xsd:string" /> <xsd:element name="image" type="imageType" /> </xsd:choice> </xsd:sequence>
javax.xml.validation • Schema 一般的なルール記述 ただし実装は W3C XML Scheman にのみ対応 • Validator 妥当性の検証を実行 validate()
妥当性検証の処理の流れ 1) Factory クラスのインスタンスの取得 SchemaFactory sf = SchemaFactory .newInstance( スキーマの種類の指定); 2) Schemaのインスタンスの取得 Schema schema = sf.newSchema(スキーマ定義入力元); 3) Validator のインスタンスの取得 4) validate( 検証対象のXML ); の呼び出し
javax.xml.validationの例(1) SchemaFactory sf = SchemaFactory.newInstance( "http://www.w3.org/2001/XMLSchema" ); Schema schema = sf.newSchema( new StreamSource( args[0] ) );
javax.xml.validationの例(2) try { Validator validator = schema.newValidator(); validator.validate( new StreamSource( args[1] ) ); } catch( Exception e ) { } *妥当でない場合には例外が発生
妥当でない場合の処理 • 例外を直接処理 (catch ブロック内で) • エラーハンドラに処理を渡す MyErrorHandler ehandler = new MyErrorHandler(); validator.setErrorHandler( ehandler ); *妥当でない – error() メソッドを呼ぶ (整形でない場合は fatalError() )
後半の内容の予定 • 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)