泛空白字元 [XML 標準]
全球資訊網協會 (W3C) XML 規格可將不同的行尾慣例正規化成單一慣例,但保留其他所有泛空白字元 (屬性值除外)。XML 也提供一組可供文件用來通知應用程式保留泛空白字元的一組工具。
泛空白字元及 XML 宣告
根據目前的 XML 1.0 標準,XML 宣告前面不能有泛空白字元。
<?xml version="1.0"?>
<BOOK>
<BOOKNAME>XML</BOOKNAME>
</BOOK>
如果 XML 宣告前面有泛空白字元,則會將泛空白字元視為處理指示。剖析器可能無法使用資訊 (特別是在編碼時)。
如需 XML 宣告的詳細資訊,請參閱 XML 宣告。
項目內容中的泛空白字元
需要使用 XML 剖析器,才能報告出現在文件內部之項目內容中的所有泛空白字元。因此,下列三份文件對 XML 剖析器而言是不同的。
<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>
對部分應用程式而言,這三個資料值比美觀的列印更重要。對以文件為導向的 XML 應用程式而言,保留泛空白字元是很重要的。
文件作者可使用 xml:space 屬性來識別對該部分而言,空白字元是很重要的文件部分。樣式表也可以使用 xml:space 屬性來保留展示的空白字元。不過,由於許多 XML 應用程式並不了解xml:space 屬性,因此請小心使用。
xml:space 屬性可接受兩個值。
default
此值允許應用程式視需要處理泛空白字元。不加入 xml:space 屬性與使用 default 值會產生相同的結果。preserve
此值會指示應用程式保留泛空白字元原狀,使應用程式認為這是有意義的值。
xml:space 屬性的值會套用至內含屬性之項目的所有子代 (除非該子代已由其中一個子項目覆寫)。
例如,下列文件將指定相同的泛空白字元行為。
<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 Core Services (MSXML) 不接受 xml:space 屬性。如果應用程式必須接受 xml:space 屬性,則也必須先將 DOMDocument 物件的 preserveWhiteSpace 屬性設為 True,才能執行剖析。
xmldoc= new ActiveXObject("Msxml2.DOMDocument.5.0");
xmldoc.preserveWhiteSpace = true;
xmldoc.load(url);
MSXML 也提供了許多設定,可讓您將應用程式泛空白字元處理委派給剖析器。如需詳細資訊,請參閱 MSXML SDK 文件中的<泛空白字元及 DOM>主題。
注意
由於保留項目之間的泛空白字元節點將帶來極大的負荷量,因此保留泛空白字元資訊可能會大幅增加「文件物件模式 (DOM)」樹狀目錄的大小。
屬性中的泛空白字元
雖然 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 字元。應用程式可使用適當的行尾轉換慣例來儲存文件。