2009年2月5日木曜日

XMLを扱う (その19) [The little XMLer ?]

XMLすらまともに理解していない。。。
XMLを理解するのにすら時間がかかる。。。
ということで結構へこんでいる。

とりあえず多少なりとも理解するためにThe little schemer風味で自分なりに整理してみた。まだ、抜け漏れ間違いを含んでいると思うけど。

Norvigはプログラミングを学ぶには10年かかると書いていたが、本当に10年かかりそうだ。

いかん。ポジティブ。こつこつ。


- "Extensible Markup Language (XML) 1.0 (Fourth Edition)"とは、XML文書の仕様を定める文書である。
この文書をXML仕様書と呼ぶ。
- XML文書を処理するa software moduleであるXML processorの振舞いの一部も定めている。
- XML processorとapplication(これもa software module)の関係の一部も定めている。

- XML documents (XML文書)とは、text(a sequence of chracters)である。
- charactersは、ISO/IEC 10646:2000 (Unicode 2.0)で定義されたcharactersである。
- textがXML文書であるということは、それがXML文書の構文規約に準拠していることが必要である。
それをwell-formed云々といったりする。
しかし、言語に構文がありそれに従っているものがその言語に属する文であることはあたりまえという観点をこの資料では採用する。
- XML「文書」という名称ではあるが、OS上のファイルである必要はない。
- 本資料では、Allegro Common LispのeliのREPL上の文字列にてXML文書を表現していることにする。

- XML文書のsemanticsは2段構造を取る。
まず第一のsemanticsはXML仕様書にて定義されているものであり、XML processorがどう振る舞うかという観点で記述されている。
例えばXHTMLについてはどうだろう。
- XML processorはXHTML文書を受取り、pysical structure(entities)に関する処理を行う。
これはCのマクロをプリプロセスするのに似ている。
- またXML processorはXHTML文書を受け取ると、logical structureに関する処理を行う。
これは、well-formedの確認、validの確認、processor instructionの解釈などを含む。
- 以上がXML processorによる(おける)semanticsである。
XHTML文書がどのように描画されるかというsemanticsはapplicationである例えばWeb browserによって(において)定義される。



インデントしている文章で言及している文字列は、一階層上の文字列の部分文字列とする。



- "a"

- "a"はCLの文字列である。
- "a"はXML文書ではない。


- "<a/>"

- "<a/>"はCLの文字列である。
- "<a/>"はXML文書である。

- "<a/>"はentityである。
- このXML文書は単一のentityで構成されている。
- "<a/>"はdocument entityである。

- "<a/>"はan elementである。
- "<a/>"のelement nameは"a"である。
- "<a/>"はan empty-element tagである。
- nameが"a"というelementはcontentを持たない。

- "<a/>"はMarkupである。character dataではない。
- "<a/>"はdocument entityが含むparsed dataである。
- このparased dataはMarkupのみから構成されている。


- "<a />"

- これはXML文書である。
- "<a />"は"a"というnameのelementである。


- "<a:b/>"

- これはXML文書である。
- "<a:b/>"は"a:b"というnameのelementである。
- ただし、XML namespaceをやる場合以外はこのnameは使うべきではない。


- "<a:b:c/>"

- これはXML文書である。
- "<a:b:c/>"は"a:b:c"というnameのelementである。
- ただし、XML namespaceとしては異常であるのでこのnameは使うべきではない。


- "<:a/>"

- これはXML文書である。
- "<:a/>"は":a"というnameのelementである。
- ただし、XML namespaceとしては異常であるのでこのnameは使うべきではない。


- "<a:/>"

- これはXML文書である。
- "<a:/>"は"a:"というnameのelementである。
- ただし、XML namespaceとしては異常であるのでこのnameは使うべきではない。


- "<a b/>"

- これはXML文書ではない。


- "<0/>"

- これはXML文書ではない。


- "<0a/>"

- これはXML文書ではない。


- "<a0/>"

- これはXML文書である。
- "<a0/>"は"a0"というnameのelementである。


- "<あ/>"

- これはXML文書である。
- "<あ/>"は"あ"というnameのelementである。


- "<a/><a/>"

- "<a/><a/>"はXML文書でない。


- "<a/><b/>"

- "<a/><b/>"はXML文書でない。


- "<a></a>"

- "<a><a/>"はXML文書である。

- "<a></a>"はentityである。
- このXML文書は単一のentityで構成されている。
- "<a></a>"はdocument entityである。

- "<a></a>"はan elementである。
- "<a></a>"のelement nameは"a"である。
- "<a></a>"はan empty-element tagではない。
- "<a>"はa start tagである。
- "</a>"はan end tagである。
- nameが"a"というelementはcontentを持たない。

- "<a></a>"はMarkupである。character dataではない。
- "<a></a>"はdocument entityが含むparsed dataである。
- このparased dataはMarkupのみから構成されている。


- "<a>x</a>"

- "<a>x</a>"はentityである。
- このXML文書は単一のentityで構成されている。
- "<a>x</a>"はdocument entityである。

- "<a>"は a start tagである。これはMarkupである。これはXML文書ではない。
- "</a>"は an end tagである。これもMarkupである。これもXML文書ではない。
- "<a>x</a>"は nameが"a"というan elementである。
- name がaというelementのcontentは"x"である。
- "x"はMarkupではない。character dataである。

- "<a>x</a>"はdocument entityが含むparsed dataである。
- このparased dataはcharacter dataでる。Markupのみから構成されている。


- "<a><b/></a>"

- "<a><b/></a>"はentityである。
- このXML文書は単一のentityで構成されている。
- "<a><b/></a>"はdocument entityである。

- "<a><b/></a>"は nameが"a"というan elementである。
- nameが"a"というelementはcontentをもっている。そのcontentは"<b/>"である。

- "<b/>"は name が "b"というan elementである。
- "<b/>"は contentを持たない。
- "<b/>"は、Markupである。character dataではない。

- "a" elementの childは"b"elementである。
- "b" elementの parentは"a"elementである。


- "<a><b/>x</a>"

- "<a><b/>x</a>"はentityである。
- このXML文書は単一のentityで構成されている。
- "<a><b/>x</a>"はdocument entityである。

- "<a><b/>x</a>"は nameが"a"というan elementである。
- nameが"a"というelementはcontentをもっている。そのcontentは"<b/>x"である。


- "<?xml version="1.0"?>"

- これはXML文書ではない。


- "<?xml version="1.0"?><a/>"

- これはXML文書である。
- "<?xml version="1.0"?>"はprologである。
- "<?xml version="1.0"?>"はprocessor instructionではない。
- "<?xml version="1.0"?>"はXML decralationである。


- "<!-- p -->"

- これはXML文書ではない。


- "<!-- p --><a/>"

- これはXML文書である。
- "<!-- p -->"はprologである。
- "<!-- p -->"はcommentである。
- "<!-- p -->"はMarkupである。

- "<?MySoft verbose="on"?><a/>"

- これはXML文書である。
- "<?MySoft verbose="on"?>"はprologである。
- "<?MySoft verbose="on"?>"はprocessor instructionである。
- "MySoft"はPITargetである。


- " <a/>"

- これはXML文書である。
- " "はprologである。
- " "はwhite spaceである。


- "<?xml version="1.0"?><!-- p --><?MySoft verbose="on"?> <a/>"

- これはXML文書である。
- "<?xml version="1.0"?><!-- p --><?MySoft verbose="on"?> "はprologである。


- "<a/><!-- p -->"

- これはXML文書である。
- "<!-- p -->"はcommentである。
- "<!-- p -->"はprologではない。


- "<a/><?MySoft verbose="on"?>"

- これはXML文書である。
- "<?MySoft verbose="on"?>"はprocessor instructionである。
- "<?MySoft verbose="on"?>"はprologではない。


- "<a/> "

- これはXML文書である。
- " "はprologではない。
- " "はwhite spaceである。


- "<!DOCTYPE><a/>"

- これはXML文書ではない。


- "<!DOCTYPE a [ <!ELEMENT a EMPTY> ]><a/>"

- これはXML文書である。
- このXML文書はvalidである。
- "<!DOCTYPE a [ <!ELEMENT a EMPTY> ]>"はprologである。
- "<!DOCTYPE a [ <!ELEMENT a EMPTY> ]>"はdocument type decralationである。Standalone Document Declarationである。
- Name "a"はroot element typeであり、XML文書のroot elementのnameと同じである必要がある。
- "[ <!ELEMENT a EMPTY> ]"はinternal subsetである。
- "<!ELEMENT a EMPTY>"はmarkup declarationである。
- "<!ELEMENT a EMPTY>"はelement declarationである。
- "a"はこのelement declarationで定義しようとしているelementのtypeである。
- "EMPTY"はcontent specである。
- "EMPTY"は、element type "a"はchildを持たない(contentを持たない)ことを現わす。


- "<!DOCTYPE a [ <!ELEMENT a ANY> ]><a/>"

- これはXML文書である。
- このXML文書はvalidである。
- "<!ELEMENT a ANY>"はelement declarationである。Standalone Document Declarationである。
- "a"はこの文字列で定義するelementのtypeである。
- "ANY"はcontent specである。
- "ANY"は、element type "a"はcontentとして「何でもOK?」ということ。具体的には次のとおり。
- character data (もちろんCDATA sectionも)
- comments
- processor instructions
- child elements (この文書で定義されているものに限る)


- "<!DOCTYPE a [ <!ELEMENT a (b,c*)><!ELEMENT b EMPTY><!ELEMENT c EMPTY> ]><a><b/><c/><c/></a>"

- これはXML文書である。
- このXML文書はvalidである。
- "<!DOCTYPE a [ <!ELEMENT a (b,c*)><!ELEMENT b EMPTY><!ELEMENT c EMPTY> ]>"はelement declarationである。
- "(b,c*)"はcharacter dataを含んでいない。
- "(b,c*)"はcontent modelである。
- "(b,c*)"、"c*"、"b"、"c"、"*"はcontent particlesである。


- "<!DOCTYPE a [ <!ELEMENT a (#PCDATA)> ]><a>x</a>"

- これはXML文書である。
- このXML文書はvalidである。
- "<!ELEMENT a (#PCDATA)>"はelement declarationである。
- "a"はこのelement declarationで定義するelementのtypeである。
- "(#PCDATA)"はcontent specである。
- "a"は、Mixed typeである。
- "<!ELEMENT a (#PCDATA)>"は、element type "a"はcontentとしてcharacter dataを持つことを現わしている。PCDATAのPはparased character dataのPであり、このネーミングは歴史的な理由による。


- "<!DOCTYPE a [ <!ELEMENT a (#PCDATA|b)*><!ELEMENT b EMPTY> ]><a><b/>x</a>"

- これはXML文書である。
- このXML文書はvalidである。
- "<!DOCTYPE a [ <!ELEMENT a (#PCDATA|b)*> ]>"はelement declarationである。
- "a"はこのelement declarationで定義するelementのtypeである。
- "(#PCDATA|b)*"はcontent specである。
- "a"は、Mixed typeである。
- "<!ELEMENT a (#PCDATA|b)*>"は、element type "a"はcontentとしてcharacter dataと"b"というnameのelementのミックスされたものを持つことを現わしている。


- "<!DOCTYPE a [ <!ELEMENT a (#PCDATA)> ]><a><![CDATA[<x>]]></a>"

- これはXML文書である。
- このXML文書はvalidである。
- "<![CDATA[<x>]]>"はCDATA sectionである。CDATA sectionの中では、Markupを表す文字列はMarkupではなく、chracter dataである。"<![CDATA["の後続において、MarkupであるとXML processorと認識するのは"]]>"であり、ここでCDATA sectionは終わる。CDATA sectionはcharacter dataが存在できる部分にはどこでも存在できる。



- "<a>&#12354;</a>"

- これはXML文書である。

- "&#12354;"はcharacter dataである。
- "&#12354;"はcharacter referenceである。
- "&#12354;"は"あ"である。
- 12354はISO/IEC 10646における"あ"のcode pointの10進数表現である。


- "<a>&#x3042;</a>"

- これはXML文書である。

- "&#x3042;"はcharacter dataである。
- "&#x3042;"はcharacter referenceである。
- "&#x3042;"は"あ"である。
- 3042はISO/IEC 10646における"あ"のcode pointである。(code pointはそもそも16進数)


- "<!DOCTYPE a [ <!ENTITY h \"hoge\"> ]><a>&h;</a>"

- これはXML文書である。

- "<!DOCTYPE a [ <!ENTITY h \"hoge\"> ]>"はprologである。
- "<!DOCTYPE a [ <!ENTITY h \"hoge\"> ]>"はdocument type declarationである。
- "<!ENTITY h \"hoge\">"はgeneral entityの定義である。

- "&h;"はreferenceである。
- "&h;"はentity referenceである。
- "&h;"はcharacter referenceではない。
- "&h;"はparameter entity referenceではない。

- "&h;"は"hoge"である。

- "<!DOCTYPE a [ <!ENTITY h \"&#60;a/>\"> ]>&h;"

- これはXML文書である。

- "<!DOCTYPE a [ <!ENTITY h \"hoge\"> ]>"はprologである。
- "<!DOCTYPE a [ <!ENTITY h \"&#60;a/>\"> ]>"はdocument type declarationである。
- "<!DOCTYPE a [ <!ENTITY h \"&#60;a/>\"> ]>"はgeneral entityの定義である。

- "&h;"はentity referenceである。
- "&h;"は"<a/>"である。


- "<!DOCTYPE a [ <!ENTITY h \"hoge\"> ]><a>&h;</a>"

- これはXML文書である。

- "<!DOCTYPE a [ <!ENTITY h \"hoge\"> ]>"はprologである。
- "<!DOCTYPE a [ <!ENTITY h \"hoge\"> ]>"はdocument type declarationである。
- "<!ENTITY h \"hoge\">"はgeneral entityの定義である。

- "&h;"はreferenceである。
- "&h;"はentity referenceである。
- "&h;"はcharacter referenceではない。
- "&h;"はparameter entity referenceではない。

- "&h;"は"hoge"である。


- "<!DOCTYPE a [ <!ENTITY h \"&#60;a/>\"> ]>&h;"

- これはXML文書である。

- "<!DOCTYPE a [ <!ENTITY h \"&#60;a/>\"> ]>"はprologである。
- "<!DOCTYPE a [ <!ENTITY h \"&#60;a/>\"> ]>"はdocument type declarationである。
- "<!ENTITY h \"&#60;a/>\">"はentity declarationである。
- "<!ENTITY h \"&#60;a/>\">"はgeneral entityである。
- "<!ENTITY h \"&#60;a/>\">"はinternal entityである。

- "&h;"はentity referenceである。
- "&h;"は"<a/>"である。


- hoge.xmlの中身は"<b/>"とする。
- hoge.xmlは、XML文書である。


- "<!DOCTYPE a [ <!ENTITY s SYSTEM \"../aka/hoge.xml\"> ]><a>&s;&s;</a>"

- これはXML文書である。

- "<!ENTITY s SYSTEM \"../aka/hoge.xml\">"はentity declarationである。
- "<!ENTITY s SYSTEM \"../aka/hoge.xml\">"はgeneral entityである。
- "<!ENTITY s SYSTEM \"../aka/hoge.xml\">"はexternal entityである。
- "\"../aka/hoge.xml\""はsystem identifierである。
- system identifierはURIである。
- hoge.xmlの中身である"<a><b/></a>"はexternal parsed entityである。

- "&s;"はentity referenceである。
- "<a>&s;&s;</a>"は"<a><b/><b/></a>"である。


- "<!DOCTYPE a [ <!ENTITY s SYSTEM \"http://www.examples.com/hoge.xml\"> ]><a>&s;&s;</a>"

- これはXML文書である。

- "<!ENTITY s SYSTEM \"http://www.examples.com/hoge.xml\">"はentity declarationである。
- "<!ENTITY s SYSTEM \"http://www.examples.com/hoge.xml\">"はgeneral entityである。
- "<!ENTITY s SYSTEM \"http://www.examples.com/hoge.xml\">"はexternal entityである。
- \"http://www.examples.com/hoge.xml\"はsystem identifierである。
- system identifierはURIである。
- hoge.xmlの中身である"<a><b/></a>"はexternal parsed entityである。

- "&s;"はentity referenceである。
- "<a>&s;&s;</a>"は"<a><b/><b/></a>"である。


- "<!DOCTYPE a [ <!ENTITY s PUBLIC \"some public id\" \"http://www.examples.com/hoge.xml\"> ]><a>&s;&s;</a>"

- これはXML文書である。

- "<!ENTITY s PUBLIC \"some public id\" \"http://www.examples.com/hoge.xml\">"はentity declarationである。
- "<!ENTITY s PUBLIC \"some public id\" \"http://www.examples.com/hoge.xml\">"はgeneral entityである。
- "<!ENTITY s PUBLIC \"some public id\" \"http://www.examples.com/hoge.xml\">"はexternal entityである。
- "\"some public id\""はpublic identifierである。
- "\"http://www.examples.com/hoge.xml\""はsystem identifierである。
- system identifierはURIである。
- hoge.xmlの中身である"<a><b/></a>"はexternal parsed entityである。

- "&s;"はentity referenceである。
- "<a>&s;&s;</a>"は"<a><b/><b/></a>"である。


- "<!DOCTYPE a [ <!ENTITY % p \"hoge\"><!ENTITY g \"piyo %p;\" ]><a>&g;</a>"

- これはXML文書である。

- "<!DOCTYPE a [ <!ENTITY % p \"hoge\"><!ENTITY g \"piyo %p;\" ]>"はprologである。
- "<!DOCTYPE a [ <!ENTITY % p \"hoge\"><!ENTITY g \"piyo %p;\" ]>"はdocument type declarationである。
- "<!ENTITY g \"piyo %p;\" ]>"はgeneral entityの定義である。
- "<!ENTITY % p \"hoge\">"はparameter entityの定義である。

- "%p;"はreferenceである。
- "%p;"はparameter entity referenceである。
- "%p;"はcharacter referenceではない。
- "%p;"はentity referenceではない。

- "%p;"は"piyo"である。

- "&g;"はreferenceである。
- "&g;"はentity referenceである。
- "&g;"はcharacter referenceではない。
- "&g;"はparameter entity referenceではない。

- "&g;"は"piyo hoge"である。


- "<!DOCTYPE a [ <!ENTITY % an \"ANY\"><!ELEMENT a %an;> ]><a/>"

- これはXML文書である。
- このXML文書はvalidである。
- "<!ENTITY % an \"ANY\">"はparameter entityの定義である。
- "<!ELEMENT a %an;>"は"<!ELEMENT a ANY>"である。


- "<!DOCTYPE a [ <!ENTITY % cm \"a (b,c*)\"><!ELEMENT %cm;><!ELEMENT b EMPTY><!ELEMENT c EMPTY> ]><a><b/><c/><c/></a>"

- これはXML文書である。
- このXML文書はvalidである。


- hoge.dtdの中身は"<!ENTITY a ANY>"とする。
- hoge.dtdは、XML文書ではない。


- "<!DOCTYPE a SYSTEM \"aka/hoge.dtd\"><a/>"

- これはXML文書である。
- これはvalidなXML文書である。

- "<!DOCTYPE a SYSTEM \"aka/hoge.dtd\">"はdocument type decralationである。
- "SYSTEM \"aka/hoge.dtd\""はExternal IDである。
- "\"aka/hoge.dtd\""はsystem identifierである。
- system identifierはURIである。
- hoge.dtdの中身はexternal subsetである。


- "<!DOCTYPE a PUBLIC \"hoge\" \"aka/hoge.dtd\"><a/>"

- これはXML文書である。
- これはvalidなXML文書である。

- "<!DOCTYPE a PUBLIC \"hoge\" \"aka/hoge.dtd\">"はdocument type decralationである。
- "PUBLIC \"hoge\" \"aka/hoge.dtd\""はExternal IDである。
- "\"hoge\""はpublic identifierである。
- "\"aka/hoge.dtd\""はsystem identifierである。
- system identifierはURIである。
- hoge.dtdの中身はexternal subsetである。



補足的なことたち。


- elementがわかればattributeは難しくないので、割愛した。

- "xml:space"というattributeは":"があるがXML namespaceの":"ではない。
- "default"または"preserve"の値をとりうる。
- どんなelementにもつけることができる。
- validにするには、このattributeを自分でdocument type declarationで定義する。
- "default"の場合は、while spaceの取り扱いがXML processorのデフォルトになる。
- "preserve"の場合は、while spaceを削除せずにそのままcharacter dataとする。

- "xml:lang"というattributeは":"があるがXML namespaceの":"ではない。
- どんなelementにもつけることができる。
- validにするには、このattributeを自分でdocument type declarationで定義する。

- external entitiesには、"<?xml encoding='utf-8'?>"などのtext declarationを冒頭に付けるべきである。

- document type declaration external subsetにおいて、または、external parameter entitiesにおいて、conditional sectionsを利用できる。これはCにおけるifdefマクロみたいなものである。例は次のとおり。

"
<!ENTITY % draft 'INCLUDE' >
<!ENTITY % final 'IGNORE' >

<![%draft;[
<!ELEMENT book (comments*, title, body, supplements?)>
]]>
<![%final;[
<!ELEMENT book (title, body, supplements?)>
]]>
"

0 件のコメント: