データ工学特論 第八回 木村昌臣 本日の話題 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についての話題
© Copyright 2024 ExpyDoc