空白 [XML 標準]

W3C (World Wide Web Consortium) XML 仕様では、異なる行末規約を 1 つの規約に正規化しますが、属性値の中を除き、すべての空白を維持します。 XML は、ドキュメントからアプリケーションに対して空白を維持する必要があるかどうかを指示するために使用できる、一連のツールも提供しています。

空白と XML 宣言

現在の XML 1.0 標準によると、XML 宣言の前に空白は許されません。

<?xml version="1.0"?>
 <BOOK>
  <BOOKNAME>XML</BOOKNAME>
 </BOOK>

XML 宣言の前に空白があると、それは処理命令として取り扱われます。 この情報 (特にエンコーディング) をパーサーが使用することは許されません。

XML 宣言の詳細については、「XML 宣言」を参照してください。

要素コンテンツに含まれる空白

XML パーサーは、ドキュメント内の要素コンテンツに含まれるすべての空白について報告しなければなりません。 この理由で、XML パーサーにとって次の 3 つのドキュメントは異なります。

<document>
<data>1</data>
<data>2</data>
<data>3</data>
</document>

および

<document><data>1</data><data>2</data><data>3</data></document>

および

<document><data>1</data> <data>2</data> <data>3</data></document>

アプリケーションにとって、3 つのデータ ポイントの値は、見た目の問題では済まないことがあります。 ドキュメント志向の XML アプリケーションでは、空白の維持が重要となることがあります。

ドキュメントの作成者は xml:space 属性を使用して、空白が重要と考えられる部分を指定することができます。 スタイル シートでも、表示で空白を維持する印として xml:space 属性を使用することができます。 しかし多くの XML アプリケーションは xml:space 属性を理解しないので、この属性を使用できない場合もあります。

xml:space 属性は 2 つの値を受け付けます。

  • default
    この値は、アプリケーションが必要に応じて空白を取り扱うことを許します。 xml:space 属性を含めない場合は、default 値を使用したのと同じ結果をもたらします。

  • preserve
    この値は、アプリケーションに空白をそのまま維持するように指示します。空白に意味があることを示唆しています。

xml:space 属性の値は、子要素にオーバーライドされない限り、この属性を含む要素のすべての子孫に適用されます。

たとえば、次の 2 つのドキュメントは同じ空白の扱いを指定しています。

<poem xml:space="default">
<author>
<givenName>Alix</givenName>
<familyName>Krakowski</familyName>
</author>
<verse xml:space="preserve">
<line>Roses   are  red,</line>
<line>Violets  are  blue.</line>
<signature xml:space="default">-Alix</signature>
</verse>
</poem>

および

<poem xml:space="default">
<author xml:space="default">
<givenName xml:space="default">Alix</givenName>
<familyName xml:space="default">Krakowski</familyName>
</author>
<verse xml:space="preserve">
<line xml:space="preserve">Roses   are  red,</line>
<line xml:space="preserve">Violets  are  blue.</line>
<signature xml:space="default">-Alix</signature>
</verse>
</poem>

いずれの例でも、詩の各行ではすべての空白を維持し、ドキュメントの他の部分の空白は必要に応じて取り扱うように、アプリケーションに対して指示されます。

言語を指定する xml:lang と同様に、検証環境で使用される場合、xml:space 属性はドキュメント型定義 (DTD) 内で宣言する必要があります。 xml 名前空間は XML 仕様で予約されているので、宣言する必要はありません。

既定で、Microsoft XML コア サービス (MSXML) は xml:space 属性を受け付けません。 アプリケーションが xml:space 属性を受け付ける必要がある場合は、解析前に DOMDocument オブジェクトの preserveWhiteSpace プロパティを True に設定する必要があります。

xmldoc= new ActiveXObject("Msxml2.DOMDocument.5.0");

xmldoc.preserveWhiteSpace = true;

xmldoc.load(url);

MSXML では、アプリケーションの空白の扱いをパーサーに委任するように設定することもできます。 詳細については、MSXML SDK ドキュメントの「White Space and the DOM」を参照してください。

注意

空白情報の維持は、要素間の空白ノードを維持する際のオーバーヘッドが原因で、DOM (Document Object Model) ツリーのサイズを大幅に増加させることがあります。

属性内の空白

XML プロセッサは、要素コンテンツに含まれるすべての空白を維持しますが、属性値内の空白はしばしば正規化します。 タブ、キャリッジ リターンおよびスペースは、単一のスペースとして報告されます。 特定の属性タイプについては、値の本体の前後にある空白を取り去り、値の内部にある空白を単一のスペースに減らします (DTD が利用できる場合、この処理は CDATA 型以外のすべての属性に対して行われます)。

たとえば、次の XML ドキュメントがあります。

<whiteSpaceLoss note1="this is a note." note2="this
is
a
note.">

XML パーサーは、改行を単一のスペースに置き換えて、両方の属性値を "this is a note." として報告します。

メモ: MSXML3 では、DOM も SAX も空白を正規化しません。 MSXML6 では、DOM は空白を正規化しませんが、SAX は正規化します。

このドキュメントの DTD がある場合、CDATA 以外の型として宣言された属性について、属性値の前後のスペースは削除され、値の中の空白のかたまりは単一のスペースで置き換えられます。 DTD がない場合は、パーサーはすべての属性が CDATA 型であると仮定します。

行末の取り扱い

XML プロセッサは、キャリッジ リターン-ライン フィードの文字シーケンス (CRLF) を単一の CR または LF のように取り扱います。 すべてが単一の LF 文字として報告されます。 アプリケーションは適切な行末規約を使用してドキュメントを保存することができます。