Java/XML(第1回)

応用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>