XmlTextReader による空白の取り扱い
空白は、有意の空白と意味のない空白の 2 種類に区分されます。有意の空白とは、DTD で定義されている混合コンテンツ モデル内の空白、または属性 xml:space が指定されているスコープ内の空白のことです (xml:space が "preserve" に設定されている場合)。有意の空白は、元のドキュメントから最終ドキュメントまで保持する必要のある空白です。意味のない空白とは、ドキュメントの読み取りから出力ドキュメントまで保持する必要のない空白です。空白は、次の文字のいずれかに該当します。
- 空白 (ASCII の空白、0x20)
- キャリッジ リターン (CR、0x0D)
- ライン フィード (LF、0x0A)
- 水平タブ (0X09)
W3C 標準では、ドキュメント内で空白が現れる場所と xml:space 属性の設定に応じて、空白の取り扱いを変えるように規定されています。空白文字が混合要素コンテンツ内または xml:space="preserve" のスコープ内に現れた場合は、空白を保持し、変更せずにアプリケーションに渡す必要があります。これ以外の空白は保持する必要はありません。
XmlTextReader では、xml:space="preserve"
のコンテキスト内にある空白だけが保持されます。XmlTextReader は DTD を解析せず、混在コンテンツが定義されているかどうかを判断できないため、DTD で混合コンテンツとして定義されている空白は保持されません。混在コンテンツ要素の空白を保持する必要がある場合は、XmlValidatingReader を使用して DTD を解析し、混在コンテンツ要素を認識できるようにします。
現在のノードにおける空白の種類を確認するには、XmlReader.NodeType プロパティを使用します。有意の空白の場合は SignificantWhitespace 列挙値が返されるのに対し、意味のない空白の場合は Whitespace 列挙値が返されます。NodeType プロパティの詳細については、「NodeType プロパティ」および「XmlNodeType 列挙体」を参照してください。
WhitespaceHandling プロパティは、列挙値を使用して空白がリーダーからどのように返されるかを判定します。このプロパティを取得または設定する方法の詳細については、「WhitespaceHandling プロパティ」を参照してください。列挙値の詳細については、「WhitespaceHandling 列挙体」を参照してください。W3C 標準の詳細については、www.w3.org/XML/Group/2000/07/REC-xml-2e-review#sec-white-space で公開されている勧告『Extensible Markup Language (XML) 1.0』のセクション 2.10 を参照してください。
空白を含み、xml:space 属性が "preserve" に設定された XML の例を次に示します。この例では、"改行" 文字が特別な空白文字として行の末尾に示されています。
<!DOCTYPE test [
<!ELEMENT test (item | book)*> <-- element content model -->
<!ELEMENT item (item*)> <-- element content model -->
<!ATTLIST item xml:space (default | preserve) #IMPLIED>
<!ELEMENT book (#PCDATA | b | i)*> <-- mixed content model -->
<!ELEMENT b (#PCDATA)> <-- mixed content model -->
<!ELEMENT i (#PCDATA)> <-- mixed content model -->
]>
•
<test>
•
••••<item>
•
••••••••<item xml:space="preserve">
º
ºººººººººººº<item/>
º
ºººººººº</item>
•
••••</item>
•
••••<book>
º
ºººººººº<b>This<b>
º
ºººººººº<i>is</i>
º
ºººººººº<b>a test</b>
º
ºººº</book>
•
</test>
•
(•) として示されている空白は意味のない空白です。(º) として示されている空白は有意の空白です。
メモ xml:space 属性のスコープでは、通常は無意味と見なされる空白が有意の空白に変更されます。
また、book
要素は DTD で混合コンテンツ モデルとして定義され、b
要素または i
要素を格納できることを示しています。混合コンテンツ モデルにおいて、book
要素内の空白は有意の空白と見なされます。XmlTextReader は、DTD で提供される情報を使用しないため、混合コンテンツ モデルを認識しません。混合コンテンツ モデルの有意の空白ノードを取得するには、XmlValidatingReader を使用する必要があります。
参照
XmlReader による XML の読み取り | 文字ストリームによるコンテンツ全体の読み取り | ドキュメント タイプ宣言 | 属性値の正規化 | XmlException を使用した XmlTextReader の例外処理 | XmlReader クラス | XmlReader メンバ | XmlNodeReader クラス | XmlNodeReader メンバ | XmlTextReader クラス | XmlTextReader メンバ | XmlValidatingReader クラス | XmlValidatingReader メンバ