応用Java(Java/XML) 第8回 2005年6月23日 植田龍男
後半の内容の予定 XPath (6/9) XSLT (6/16) 名前空間(Namespace) (6/16) XML文書の妥当性の検証(6/23) DTD, W3C XML Schema SOAP, RMI(7/7, 7/14, 7/21) 試験(7/28)
復習:整形(Well Formed)文書 要素は開始タグと終了タグ <abc> This is a pen. </abc> <img src=“java.png” /> 要素は階層的な親子関係 全体は単独の要素で囲まれる (Document Type )
整形ではない例(1) <World> <Japan> <China> <USA>
整形ではない例(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)」の概念 「妥当」であることをどう定めるか? 要素の名前、出現順序、親子関係
DTD と妥当性の検証 DTD( Document Type Definition) XMLのルールを記述する専用言語 SGMLからの流れ 当初のXMLはすべてDTDで書かれた XMLとは全く異なる文法 表現力の制約、名前空間の制約
DTDの例(1) <!DOCTYPE name [<!ELEMENT name (first, last)> <!ELEMENT first (#PCDATA)> <!ELEMENT last (#PCDATA)>] > <name> <first>Tatsuo</first> <last>Ueda</last> </name>
妥当ではない文書の例(1) <!DOCTYPE name [<!ELEMENT name (first, last)> <!ELEMENT first (#PCDATA)> <!ELEMENT last (#PCDATA)>] > <name> <last>Ueda</last> <first>Tatsuo</first> </name>
妥当ではない文書の例(2) <!DOCTYPE name [<!ELEMENT name (first, last)> <!ELEMENT first (#PCDATA)> <!ELEMENT last (#PCDATA)>] > <name> Tatsuo <last>Ueda</last> </name>
もう少し複雑なDTD <!ELEMENT people (name+)> <!ELEMENT name (first, middle?, last)> <!ELEMENT first (#PCDATA)> <!ELEMENT middle (#PCDATA)> <!ELEMENT last (#PCDATA)>
回数を指定する記号 + --- 1回以上の任意の回数 ? --- 1回または0回(省略可能) * --- 0回以上の任意の回数 + --- 1回以上の任意の回数 ? --- 1回または0回(省略可能) * --- 0回以上の任意の回数 記号による指定なしは1回(省略不可)
さらに複雑なDTDの例 <!ELEMENT document (title?, (text|image)*)> <!ELEMENT title (#PCDATA)> <!ELEMENT text (#PCDATA)> <!ELEMENT image EMPTY> <!ATTLIST image s NMTOKEN #REQUIRED w NMTOKEN #IMPLIED h NMTOKEN #IMPLIED>
| と * の組み合わせ | 「または」の意味 ( text | image ) いずれか一方 ( text | image )* 任意の順序で任意の回数出現
属性の定義 <!ATTLIST …. > 属性のリスト 対象の要素の指定 属性名 データ型 必須か省略化か、デフォルト値
妥当な文書の例 <!DOCTYPE document SYSTEM "sample.dtd"> <document> <title>Java and XML</title> <text> Let's begin, now! </text> <image s="java.png" w="128" h="64"/> <image s="cg.png" w="400" h="300"/> <text>Java 3D</text> </document>
名前空間の処理(復習) パーサへの通知 SAXParserFactory spf = SAXParserFactory.newInstance(); spf.setNamespaceAware( true ); SAXParser parser = spf.newSAXParser();
DTDによる検証を実行する = SAXParserFactory.newInstance(); SAXParserFactory spf = SAXParserFactory.newInstance(); spf.setNamespaceAware( true ); spf.setValidating( true ); SAXParser parser = spf.newSAXParser(); XMLReader reader = parser.getXMLReader();
DOMのパーサの場合 = DocumentBuilderFactory .newInstance(); dbf.setNamespaceAware( true ); dbf.setValidating( true ); DocumentBuilder db = dbf.newDocumentBuilder();
ignorableWhitespace() ContentHandlerに定義 DTDでは本来入れない場所に文字! 人間の目のための区切りと解釈 (空白、タブ、改行)
無視されるべき空白文字 <!DOCTYPE name [<!ELEMENT name (first, last)> <!ELEMENT first (#PCDATA)> <!ELEMENT last (#PCDATA)>] > <name> <first>Tatsuo</first> <last>Ueda</last> </name>
XML文書の設計とスキーマ言語 スキーマ言語 DTD (document type definition) XML Schema W3C XML Schema RELAX NG Schematron
W3C XML Schema の特徴 優れた表現力 厳密な定義 豊富なデータ型 名前空間の利用 それ自身がXMLである! 事実上の標準規格
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>
DTD との比較(1) <!ELEMENT first (#PCDATA)> <xsd:element name="first" type="xsd:string"/>
DTD との比較(2) <!ELEMENT name … <xsd:element name="name“ type="nameType"/> <xsd:complexType name="nameType"> : (first, 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>
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>
DTDとの比較(3) * minOccurs=“0“ maxOccurs="unbounded“ + ? minOccurs=“0“ maxOccurs=“1“ 記号なし minOccurs=“1“ maxOccurs=“1“
XML Schemaによる検証(SAX) SAXParserFactory spf = SAXParserFactory.newInstance(); spf.setNamespaceAware( true ); spf.setValidating( true ); SAXParser parser = spf.newSAXParser(); parser.setProperty( "http://java.sun.com/xml/jaxp/properties/ schemaLanguage", "http://www.w3.org/2001/XMLSchema" );
XML Schemaによる検証(DOM) DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware( true ); dbf.setValidating( true ); dbf.setAttribute( "http://java.sun.com/xml/jaxp/properties/ schemaLanguage", "http://www.w3.org/2001/XMLSchema" ); DocumentBuilder db = dbf.newDocumentBuilder();
javax.xml.validation Schema 一般的なルール記述 ただしJDK5.0の実装は W3C XML Scheman にのみ対応 Validator 妥当性の検証を実行 validate()
javax.xml.validation の例 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 ) { }
まとめ (用語とその意味) XML文書の処理とパーサ SAX (Simple API for XML) DOM (Document Object Model) XPath XSLT (eXtensible Stylesheet Language / Transformation ) 名前空間 (Namespace) DTD と W3C XML Schema
プログラミングの特徴 共通したデザインパターン (クラス、メソッドの命名規則など) SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser parser = spf.newSAXParser();