データ工学特論

データ工学特論
第八回
木村昌臣
本日の話題

XMLとは何か
XMLとは

eXtensible Markup Language



拡張可能なマーク付け言語
SGMLが先祖
テキスト形式の文書

文字列の意味づけにタグを用いる




自由にタグを設計することができる
タグは必ず閉じる
タグに属性を持たせることが可能
プラットフォームで共通のフォーマットであるため

データ交換に有利
HTMLはXMLか?

HTMLもXMLもタグ言語であることは共通している


データの内容とタグの関係



先祖はSGML
HTMLのタグは画面表示用のものであり、データの内容
とは直接関係ない
XMLはタグによってデータ構造を規定する
タグに対する制約


HTMLは<P>や<BR>など閉じなくてよいタグが存在する
XMLのタグは必ず閉じなければならない
要素・属性

要素

タグで囲まれたXMLに含まれるデータの最小単
位


中に値を持たない要素を空要素という


<name>木村</name> など
<name /> は<name></name>と同じ
属性


要素に対する付加的な情報
開始タグに 属性名=“値” という形で入る

<name staff=“yes” >木村</name>など
XMLの構造
XML宣言
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE book[
<!ELEMENT book (bookname,author+)>
DTD宣言
<!ELEMENT bookname (#PCDATA)>
<!ELEMENT author (name)>
<!ELEMENT name (#PCDATA)>
<!ATTLIST book format (paperback | hardback) "paperback">
]>
<book format=“hardback” >
属性
<bookname>徹底攻略 XMLマスター教科書</bookname>
<author>
<name>福内 かおり</name>
要素
</author>
<author>
<name>木村 達哉</name>
</author>
</book>
XML宣言

XMLであることの宣言



必須(これがないとXMLとは認められない)
<?xml version=“1.0”?> が基本
以下の三つの情報から成る

バージョン情報


エンコーディング情報



version=“1.0”
encoding=“Shift_JIS”
UTF-8の場合は省略可能(default)
スタンドアローン情報


standalone=“no” (default)
外部の情報(属性のデフォルト値や実体参照)に依存していな
いときはyes。
DTD

XMLの構造を定義
<!DOCTYPE ルート要素名[
<!ELEMENT 要素名 (子要素についての定義)>
・・・
<!ATTLIST タグ名 属性名 属性値の候補 デフォルト指定>
・・・
<!ENTITY 実体名 実体値>
・・・
]>
ルート要素・・・入れ子になっているタグの一番外側にあるタグ
要素定義
<!ELEMENT 要素名 (子要素1, 子要素2・・・)>
要素の中に、子要素が指定された順番に出現する
<!ELEMENT 要素名 (子要素1 | 子要素2 |・・・)>
要素の中に、指定された子要素のいずれかが出現
する
<!ELEMENT 要素名 (#PCDATA)>
要素の中はテキストデータのみで、タグは含まない
子要素の右側に+(1回以上の繰り返し)、*(0回以上の繰り返し)、
? (0回または1回)を指定することができる
属性定義
<!ATTLIST タグ名 属性名 属性値の候補 デフォルト指定>
【属性値の候補】
(値1|値2|・・・)
CDATA
ID
IDREF(IDREFS)
NMTOKEN(NMTOKENS)
列挙された値のいずれかをとる
文字データ
英字で始まる文字列で重複なし
ID指定の属性の値のみとれる
英字、数字もしくは「- _ , .」の文字のみ
とれる
IDREFSとNMTOKENSは、IDREFやNMTOKENの値をスペース区
切りで列挙
属性定義
<!ATTLIST タグ名 属性名 属性値の候補 デフォルト指定>
【デフォルト指定】
#FIXED “値”
#IMPLIED
#REQUIRED
“値”
属性値を指定した値に固定
(省略のみできる)
属性を省略可能にする
属性の指定を必須にする
XMLインスタンスに属性が
設定されていない場合は、
デフォルトで指定した値を指定
する
前出の例題のDTDをみると・・・
ルート要素はbook
book要素の中にはbooknameとauthor
をこの順でもつ(authorは1回以上)
<!DOCTYPE book[
<!ELEMENT book (bookname,author+)>
bookname要素の中は
<!ELEMENT bookname (#PCDATA)> 文字列でタグは含まない
<!ELEMENT author (name)>
<!ELEMENT name (#PCDATA)>
<!ATTLIST book format (paperback|hardback) "paperback">
]>
Book要素のformat属性はpaperbackかhardbackの
いずれかの値をとり、デフォルトはpaperback
実体参照
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE school[
<!ENTITY location “大宮">
]>
<school name="芝浦工業大学">
<div>
<name>機械第二学科</name>
<campus>&location;</campus>
</div>
<div>
<name>情報工学科</name>
<campus>&location;</campus>
</div>
</school>
locationに文字列”大宮”を
割り当てる
XMLデータ内で、
その値を参照することができる。
これにより、
複数の場所で同じ値を参照
させることができ、
locationが指す値を変更することに
よって、一度に値を修正する
ことが可能になる。
(たとえば、”大宮”→”豊洲”など)
実体参照(解釈時)
location=“大宮”
とした場合
location=“豊洲”
と変更した場合
DTDを外出しにする(外部サブセット)
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE book SYSTEM "book.dtd">
<book format="hardback">
<bookname>徹底攻略 XMLマスター教科書</bookname>
<author>
<name>福内 かおり</name>
</author>
<author>
<name>木村 達哉</name>
</author>
</book>
DTDを外出しにする(外部サブセット)

ファイルbook.dtdの内部
<!ELEMENT book (bookname,author+,editor*)>
<!ELEMENT bookname (#PCDATA)>
<!ELEMENT author (name)>
<!ELEMENT name (#PCDATA)>
あとの話のために追加
<!ELEMENT editor (edname)>
<!ELEMENT edname (#PCDATA)>
<!ATTLIST book format (%booktype;) "paperback">
パラメタ実体参照

DTDのカスタマイズを容易にするため、DTD
内部で利用可能な実体参照


authorとeditorの要素にあるname要素は、現在は
#PCDATAとなっているが、将来はfamily name要
素とfirst name要素を分けて登録したい時など
ただし、XML内部に記述されたDTD(内部サブ
セット)では、マーク付け宣言の中でパラメタ実体
参照が使えない(使うとエラーになる)
パラメタ実体参照(外部サブセット)
<!ELEMENT book (bookname,author+,editor*)>
<!ENTITY % nameStructure "#PCDATA">
パラメタ実体
<!ELEMENT bookname (#PCDATA)>
<!ELEMENT author (name)>
<!ELEMENT name (%nameStructure;)>
パラメタ実体参照
<!ELEMENT editor (edname)>
<!ELEMENT edname (%nameStructure;)>
<!ATTLIST book format (paperback|hardback) "paperback">
外部解析対象実体参照



XMLの一部をファイルに切り出して、それを参照する方法
<!ENTITY chapter1 SYSTEM “chapter1.xml”>
のようにDTDに宣言する。
chapter1.xmlは、XMLと同等の宣言を行うが、XMLの要件
を満たす必要はない。chapter1.xmlの内容が
<?xml version=“1.0” encoding=“Shift_JIS”?>
<name>木村</name>
<name>野村</name>
<name>小池</name>
であるとルート要素が複数あるのでXMLではないが、外部
解析対象実体にはなりうる。
名前空間(namespace)

要素や属性として使われる名前の集合体

意味が異なるが同じ名前の要素が複数ある場
合、コンピュータがそれらを区別することは困難


例えば、本の名前と著者の名前は共に名前なので
nameというタグを使いたいが、項目としては別物な
のでそれぞれ別の処理を施したいような時
複数の人が要素や属性の体系を作った場合、
違う内容の要素に同じ名前をつけても別物であ
ると区別できるようにしたい
namespaceを使わないと
本の名前要素もnameタグを使いたいとすると、
<?xml version="1.0" encoding="Shift_JIS"?>
<book>
<name>徹底攻略 XMLマスター教科書</name>
<author>
<name><family>福内</family>
<first>かおり</first>
</name>
</author>
コンピュータで処理をするとき、項目としては
</book>
区別すべきものであるので、別の処理を施す
必要がある。ただし、同じ要素名であるため
コンピュータには区別させずらい。
namespaceを使うと
本の名前要素もnameタグを使いたいとすると、
<?xml version="1.0" encoding="Shift_JIS"?>
<b:book xmlns:b=“http://www.data.co.jp/book/”>
<b:name>徹底攻略 XMLマスター教科書</b:name>
<a:author xmlns:a=“http://www.data.co.jp/author/”>
<a:name><a:family>福内</a:family>
<a:first>かおり</a:first></a:name>
</a:author>
Namespaceのおかげで
</b:book>
別々のものと認識
できるため、別の処理を
コンピュータにさせることが
容易
XMLスキーマ

XMLの要素等の定義をXML形式で決定し
たい


namespaceと共存しやすい


DTDは、XMLの要素等の定義を決めるために
利用されたがXMLの形式になっていない
DTDの仕組みはnamespaceをつかう前提で設計
されていない
繰り返しの指定方法はDTDより自由度が高
い
DTDとXML Schemaの比較
<!DOCTYPE book[
<!ELEMENT book (bookname)>
<!ELEMENT bookname (#PCDATA)>
]>
<?xml version="1.0"?>
<xsd:schema xmlns:xsd=http://www.w3.org/2001/XMLSchema
targetNamespace=http://www.data.co.jp/bookSchema/>
<xsd:element name=“book">
<xsd:complexType>
<xsd:element name=“bookname" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>
来週のトピックス


XSLTやDOMなど、XMLを操作するための
道具についての紹介
XML databaseについての話題