本家「@IT」にはない内容をエンジニアライフで技術紹介するコラム。広く議論する場になることを目指します。

第039回_XML文書とXMLプロセッサ

»
今回からW3Cの勧告をしっかり読んでいきます。まずはXMLパーサ全体に関する仕様を読んでXMLパーサの種類を仕様化します。このためにW3Cの勧告を順不同で読んでいきますのでご注意ください。

整形式のXML文書と妥当なXML文書

XMLファイルを読み込んで作成するデータオブジェクトについてW3C勧告の定義を確認します。
----W3C勧告----
2 Documents
[Definition: A data object is an XML document if it is well-formed, as defined in this specification.In addition, the XML document is valid if it meets certain further constraints.]

Each XML document has both a logical and a physical structure. Physically, the document is composed of unitscalled entities. An entity may refer to other entities to cause their inclusion in the document.A document begins in a "root" or document entity. Logically, the document is composed of declarations, elements,comments, character references, and processing instructions, all of which are indicated in the document by explicit markup. The logical and physical structures must nest properly, as described in 4.3.2 Well-Formed Parsed Entities.

2.1 Well-Formed XML Documents
[Definition: A textual object is a well-formed XML document if:] Taken as a whole, it matches the production labeled document. It meets all the well-formedness constraints given in this specification. Each of the parsed entities which is referenced directly or indirectly within the document is well-formed.
----W3C勧告----
----日本語訳----
2 文書
[定義:あるデータオブジェクトがこの仕様書で定義するXML文書であるなら、そのデータオブジェクトは整形式である。さらに、特定の制約を満たしたならば、そのXML文書は妥当である。]

1つ1つのXML文書は論理構造と物理構造の両方を持っている。物理的に、文書は実体という単位から構成する。実体は他の実体を文書中にインクルードするために参照することができる。文書は「ルート」あるいは文書要素から始まる。
# ★ document entityと書いてあるが、これはdocument element
#  の書き間違いと筆者は思う。
論理的に、文書は宣言、要素、コメント、文字参照、処理命令から構成する。これらは、文書中で明確にマークアップで示す。4.3.2 整形式の解析対象実体で説明しているように論理構造や物理構造は適切にネストしなければならない。

2.1 整形式のXML文書
[定義: 次の条件を満たすとき、テキストオブジェクトは整形式のXML文書とする。] documentの生成規則にマッチすること。この仕様が与えるすべての整形式制約を満たすこと。文書中の直接・間接的に参照する解析対象実体のそれぞれが整形式であること。
----日本語訳----

仕様を整理すると次のようになります。

■XML文書
XMLファイルを読み込んだ物をXML文書と呼びます。XML文書は論理構造と物理構造という定義で説明できます。ただし、XML文書は論理構造部分と物理構造部分に分けられるものではありません。2つは異なる概念です。

-物理構造
XML文書は実体です。(これを文書実体と呼びますがここには書いておらず別の章に書いてあります。)実体は他の実体を参照することができます。(実体は自己参照はできません。)
文書実体は文書要素から始まります。文書要素とはdocumentの生成規則に出てくるelementを指します。生成規則elementはelementを含みますが、Documentに出てくるelementは特別にdocument element(root)と呼びます。それなら生成規則は別にしておけば良かったのではないかと思います。つまり、

document ::= ( prolog docElement Misc* )

docElement ::= EmptyElemTag | (STag content ETag)
# conentの中ではelementが出現する

element  ::= EmptyElemTag | (STag content ETag)

とすれば判りやすいと思います。

-論理構造
XML文書の構成は、宣言、要素、コメント、文字参照、処理命令から成ります。

-補足
物理構造の説明の意味不明な点は、
 「XML文書は文書要素から始まる」
という箇所です。

生成規則から言えばXML文書はprolog宣言から始まります。決して docElementから始まりません。「文書実体の内容が文書要素から始まる」と解釈すれば良いとは思いますが、確信があるわけではありません。

■整形式のXML文書
最低限、XML文書として読み込むためには
 1.documentの生成規則にマッチすること
 2.この仕様が与えるすべての整形式性制約を満たすこと
 3.文書中の直接・間接的に参照する解析対象実体のそれぞれが整形式であること
を確認しなければなりません。

もし1~3のいずれかの条件がNGならば処理を中断し、読み込みNGにしなければいけません。

従って、読み込みが正常に終了したXML文書は「整形式である」と言います。

■妥当なXML文書
整形式の条件に加えて
 4.妥当性制約を満たす
場合、そのXML文書は「妥当である」と言います。

■整形式のXML文書と妥当なXML文書の包含関係
これらの条件から、「整形式である」XML文書は、「妥当でない」かもしれないですし、「妥当である」かもしれません。「妥当である」XML文書は、必ず「整形式である」と言えます。

妥当性を検証するプロセッサと妥当性を検証しないプロセッサ

----W3C勧告----
5 Conformance
5.1 Validating and Non-Validating Processors
Conforming XML processors fall into two classes: validating and non-validating. Validating and non-validating processors alike must report violations of this specification's well-formedness constraints in the content of the document entity and any other parsed entities that they read.

[Definition: Validating processors must, at user option, report violations of the constraints expressed by the declarations in the DTD, and failures to fulfill the validity constraints given in this specification.] To accomplish this, validating XML processors must read and process the entire DTD and all external parsed entities referenced in the document.

Non-validating processors are required to check only the document entity, including the entire internal DTD subset, for well-formedness. [Definition: While they are not required to check the document for validity, they are required to process all the declarations they read in the internal DTD subset and in any parameter entity that they read, up to the first reference to a parameter entity that they do not read; that is to say, they must use the information in those declarations to normalize attribute values, include the replacement text of internal entities, and supply default attribute values.] Except when standalone="yes", they must not process entity declarations or attribute-list declarations encountered after a reference to a parameter entity that is not read, since the entity may have contained overriding declarations; when standalone="yes",
processors must process these declarations.

Note that when processing invalid documents with a non-validating processor the application may not be presented with consistent information. For example, several requirements for uniqueness within the document may not be met, including more than one element with the same id, duplicate declarations of elements or notations with the same name, etc. In these cases the behavior of the parser with respect to reporting such information to the application is undefined.

XML 1.1 processors must be able to process both XML 1.0 and XML 1.1 documents. Programs which generate XML should generate XML 1.0, unless one of the specific features of XML 1.1 is required.
----W3C勧告----
----日本語訳----
5 適合性
5.1 妥当性を検証するプロセッサと妥当性を検証しないプロセッサ
XMLプロセッサの適合性は「妥当性を検証する」と「妥当性を検証しない」の2つのクラスに分類できる。「妥当性を検証する」プロセッサと「妥当性を検証しない」プロセッサは、どちらも
文書実体やそれ以外に読み取った解析対象実体に対して
この仕様書が示す整形式制約への違反を報告しなければならない。

[定義: 妥当性を検証するプロセッサは、ユーザのオプション指定がある場合には、DTDの宣言が表現する制約の違反とこの仕様書が与える妥当性制約の確認をしようとして失敗したことを報告しなければならない。] この要件を実現するために、妥当性を検証するXMLプロセッサはDTD全体と文書が参照するすべての外部解析対象実体を読み取り、処理しなければならない。

妥当性を検証しないプロセッサは、整形式であるかを確認するために内部DTDサブセットを含めた文書実体だけを検査することが要件となる。[定義: 妥当性を検証しないプロセッサは妥当性のために文書実体を検査しなくてよい。ただし、内部サブセットと読み込んだパラメータ実体の中に現れる宣言を読み込む必要がある。ただし、読まなかったパラメータ実体の参照が最初に現れた場合は、それ以降は読まなくて良い。;つまり、属性値を正規化したり、内部実体の置換テキストをインクルードしたり、デフォルトの属性値を与えるために宣言の中の情報を使わなければならない。]

妥当性を検証しないプロセッサは、standalone="yes"である場合を除いて、読んでいないパラメータ実体の参照が現れた後は、実体宣言と属性リスト宣言を処理してはいけない。その理由は、読み取れなかったパラメータ実体宣言が実体宣言と属性リスト宣言の内容を上書きする可能性があるからである。; standalone="yes"の場合、読み取れないパラメータ実体参照の後ろにある実体宣言と属性リスト宣言を処理しなければならない。

妥当性を検証しないプロセッサで妥当でない文書を処理する時、アプリケーションは矛盾のない情報を受け取れないかもしれない点に注意せよ。例えば、文書上の一意性を示す要件を満たさないかもしれない。
――――
 同じIDを持つ要素が複数ある
 同じ名前の要素宣言や記法宣言の重複
 etc...
が考えられる。
――――
これらの場合、妥当性を検証しないプロセッサがアプリケーションに対してどのような情報を報告するかの点についての振る舞いは定義しない。

XML1.1のプロセッサは、XML1.0とXML1.1の両方の文書を処理することができなければいけない。XMLを生成するプログラムはXML1.1特有の仕様を使わない限りXML1.0の文書を生成するべきである。
----日本語訳----

仕様を整理すると次のようになります。

■妥当性を検証するプロセッサと妥当性を検証しないプロセッサ
XMLパーサのことをW3CではXMLプロセッサ(XMLの処理器)と呼びます。XMLプロセッサはさらに、妥当性を検証するプロセッサと妥当性を検証しないプロセッサに分かれます。
理由は簡単で、先に説明したように整形式のXML文書と妥当なXML文書があるからです。どちらもXML文書ですから
 妥当でなくても整形式なら読めるXMLプロセッサ

 妥当なXML文書だけを読むXMLプロセッサ
が必要になるのです。

■妥当性を検証するプロセッサの要件
文書実体に整形式制約への違反があるとき報告する(共通)
解析対象実体に整形式制約への違反があるとき報告する(共通)
XML1.0とXML1.1の文書を処理する オプションの指定がある場合
 DTDの宣言が表現する制約の違反があるとき報告する
 妥当性制約に違反があるとき報告する

■妥当性を検証しないプロセッサの要件
文書実体に整形式制約への違反があるとき報告する(共通)
解析対象実体に整形式制約への違反があるとき報告する(共通)
内部DTDサブセットを含めた文書実体だけを検査する(←この要件は間違っている可能性があります)
XML1.0とXML1.1の文書を処理する

standalone="yes"の場合
参照することができないパラメータ実体が現れた後の実体宣言と属性リスト宣言を処理する

standalone="no"またはstandalneが未指定の場合(デフォルトで"no"とみなす)
参照することができないパラメータ実体が現れた後の実体宣言と属性リスト宣言を無視する

補足1:解析対象実体は--実体について説明するコラムで後述しますが--内部解析対象実体と外部解析対象実体があります。外部解析対象実体が実体値の中での参照として現れた場合、これをバイパスして処理するために文書実体だけを検査するという説明は矛盾しています。たしかに内容(content)だけを考えれば正しいのですが・・・・正確とは思えません。
補足2:まずDTDの主な機能は妥当性を検証する定義ですが、それ以外に文字参照や属性値のデフォルト値に関する指定が定義できます。よって、妥当性を検証しないプロセッサでもDTDを完全に読み飛ばすことはできません。

本コラムでは不確かな要件を使いたくないので妥当性を検証するプロセッサを作成していきます。
Comment(0)

コメント

コメントを投稿する