応用Java(Java/XML) 第11回 2005年6月30日 植田龍男 後半の内容の予定 XPath (6/9) XSLT (6/16) 名前空間(Namespace) (6/23) XML文書の妥当性の検証 DTD(6/30) XML Schema(7/7) 総まとめ(7/14) 試験(7/21) 復習:整形(Well Formed)文書 要素は開始タグと終了タグ <abc> This is a pen. </abc> <img src=“java.png” /> 要素は階層的な親子関係 全体は単独の要素で囲まれる (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)」の概念 「妥当」であることをどう定めるか? 要素の名前、出現順序、親子関係 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> 妥当ではない文書の例(2) <!DOCTYPE name [<!ELEMENT name (first, last)> <!ELEMENT first (#PCDATA)> <!ELEMENT last (#PCDATA)>] > <name> Tatsuo <last>Ueda</last> </name> もう少し複雑なDTD <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT people (name+)> name (first, middle?, last)> first (#PCDATA)> middle (#PCDATA)> last (#PCDATA)> 回数を指定する記号 + --- 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 spf = SAXParserFactory.newInstance(); spf.setNamespaceAware( true ); spf.setValidating( true ); SAXParser parser = spf.newSAXParser(); XMLReader reader = parser.getXMLReader(); DOMのパーサの場合 DocumentBuilderFactory = 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>
© Copyright 2025 ExpyDoc