作者:AngelGavin 出處:CSDN
如何載入有外國和特殊字元的文件?
文件可以包含外國字符,例如:
foreign characters (úóí?)
例如?磲的外國字元必須在前面加上escape 序列。外國字元可以是UTF-8 編碼或用不同編碼指定,如下所示:
foreign characters (?磲)
現在可以正確載入XML 了。
其他字元是保留在XML 中的,並且需要以不同的方式處理。下面的XML:
This & that
產生以下錯誤:
此處不允許有空格。
行0000001: This & that
位置 0000012: ----------^
此處& 是XML 句法結構的一部分,如果它僅僅放在XML 資料來源內部,那麼不能解釋為&。您需要替換稱為“實體”的特殊字元序列。
This & that
下面的字元需要對應的實體:
< <
& &
> >
" "
' '
引號字元被用作標記中屬性值的定界符,因此通常不能在屬性值的內部使用。例如,下面的內容將傳回錯誤:
此處的單引號既用作屬性定界符,又在屬性值本身。為了修正這個問題,可以將屬性定界符換成雙引號:
或者可以將單引號轉義為實體'
上述兩種方式都將透過XML 物件模型中的getAttribute 方法傳回屬性值John's Stuff。同樣,對於雙引號,您可以使用實體"。
也可以透過將文字放在CDATA 節中來處理元素內容中的特殊字元。下面的內容是正確的:
在本範例中,XML 物件模型將CDATA 節點顯示xml 節點的子節點,它將傳回字串
This & that is just "text" content.
作為nodeValue。
如何在Visual Studio 6.0 C++ 中使用MSXML COM 元件?
在Visual C++ 6.0 中使用MSXML COM 元件最簡單的方式是使用 #import 指令:
#import "msxml.dll" named_guids no_namespace#import "msxml.dll" named_guids no_namespace
它定義了所有IXML* 介面和介面ID,從而可以在應用程式中使用它們了。也可以從INETSDK 取得MSXML 類型庫和頭檔(英文),以及包含類別IIDs 的uuid.lib。
如何在XML 中使用HTML 實體?
下面的XML 包含HTML 實體:
Copyright ? 2000, Microsoft Inc, All rights reserved.
它產生下列錯誤:
引用未定義的實體'copy'。
行: 1, 位置:23, 錯誤碼:0xC00CE002
Copyright ? 2000, ...
----------------------^
這是因為XML 只有五個內建實體。關於內建實體的詳細信息,請參閱如何載入有外國和特殊字元的文件? 。
要使用HTML 實體,需要用DTD 定義它們。有關DTD 的詳細信息,請參閱W3C XML 建議(英文)。要使用該DTD,請將它直接包括在DOCTYPE 標記中,如下所示:
Copyright ? 2000, Microsoft Inc, All rights reserved.
要載入它,需要關閉IXMLDOMDocument 介面的validateOnParse 屬性。請嘗試將它貼到「Validator 測試頁」中,關閉DTD 驗證,然後按一下「驗證」。請注意文件將加載,並且版權字元將顯示在validator 頁面的末尾的DOM 樹中。
如果已經完成了DTD 驗證,那麼必須將作為參數實體的HTML 實體納入現有的DTD 中,如下所示:
%HTMLENT;
%HTMLENT;
它將定義所有HTML 實體,以便在XML 文件中使用它們。
在元素內容中如何處理空白字元?
XML DOM 有三種存取元素文字內容的方式:
屬性行為
nodeValue 按照原始的XML 來源中指定的那樣,傳回TEXT、CDATA、COMMENT 和PI 節點上的原始文字內容(包括空白字元)。對於ELEMENT 節點和DOCUMENT 本身,則傳回空值。
資料與nodeValue 相同
文字重複連接指定子樹中的多個TEXT 和CDATA 節點並傳回組合結果。
注意: 空白字元包括新行、tab 和空格。
nodeValue 屬性通常傳回原始文件中的內容,與文件如何載入和目前xml:space 範圍無關。
文字屬性連接指定子樹中的所有文字並擴展實體。
這與文件如何載入
、preserveWhiteSpace 開關的目前狀態和目前xml:space 範圍有關,請看如下所示: preserveWhiteSpace = true when the document is loaded
preserveWhiteSpace=true | preserveWhiteSpace=true | preserveWhiteSpace=false | preserveWhiteSpace=false |
xml:space=preserve | xml:space=default | xml:space=preserve | xml:space=default |
保留 | 保留 | 保留 | 並截斷 |
preserveWhiteSpace = false when the document isloaded
preserveWhiteSpace=true | preserveWhiteSpace=true | preserveWhiteSpace=false | preserveWhiteSpace=false |
xml:space=preserve | xml:space=default | xml:space=preserve | xml:space=default |
半保留 | 半保留並截斷 | 半保留 | 半保留並截斷 |
此處的保留表示和截斷此處半保留表示原始XML 文件中完全相同的原始文字內容,截斷意味著前導和尾部空格已經刪除,半保留意味著保留了“重要的空白字元”並規範化了“不重要的空白字元”。重要的空白字元是文字內容內部的空白字元。不重要的空白字符是標記之間的空白字符,請看如下所示:
n
t Janen
tSmith n
在本範例中,紅色是可以忽略的不重要的空白字符,而綠色是重要的空白字符,因為它是文字內容的一部分,因此有不可忽略的重要含義。所以在本例中,文字屬性傳回下列結果:
狀態回傳值保留"nt JanentSmith n"
保留並截斷"JanentSmith"
半保留" Jane Smith "
半保留並截斷"Jane Smith"
請注意「半保留」將規範化不重要的空白字符,例如,新行和tab 字符將退化為單個空格。如果變更xml:space 屬性和preserveWhiteSpace 開關,那麼文字屬性將會傳回對應的不同值。
CDATA and xml:space="preserve" subtree boundaries
在下面的例子中,CDATA 節點或「保留」節點的內容將會連接,原因是它們不參與不重要的空白字元規範化。例如:
n
t Jane n
t Smith ]>n
在這種情況下,CDATA 節點內部的空白字元不再與“不重要”空白字元“合併”,並且不會截斷。因此「半保留並截斷」情況將傳回下列內容:
"Jane Smith "
在此, 和標記之間的不重要的空白字元將包括在內,與CDATA 節點的內容無關。如果用下列內容取代CDATA,那麼將會傳回相同結果:
Smith
實體是特殊的
實體是作為DTD 的一部分加載和分析的,並且顯示在DOCTYPE 節點下。它們不一定要有任何xml:space 範圍。例如:
Jane n
tn
">
]>
&Jane;
假定preserveWhiteSpace=false(在DOCTYPE 標記範圍內),在分析實體時不重要的空白字元遺失。實體將不會有空白字元節點。樹將類似於:
DOCTYPE foo
ENTITY: Jane
ELEMENT: employee
ELEMENT: name
TEXT: Jane
ELEMENT: title
TEXT>:Software Design Engineer
ELEMENT: foo
ATTRIBUTE: xml:space="preserve"
ENTITYREF: Jane
請注意,在DOCTYPE 內部ENTITY 節點下顯露的DOM 樹不包含任何WHITESPACE 節點。這意味著ENTITYREF 節點的子節點也沒有WHITESPACE 節點,即使實體引用在xml:space="preserve" 的範圍內也是如此。
給定文件中引用的每個ENTITY 的實例通常都有相同的樹。
如果實體必須絕對保留空白字符,那麼它必須在自己內部指定自己的xml:space 屬性,或者文檔preserveWhiteSpace 開關必須設為true。
如何處理屬性中的空白字元?
有幾種方式可以存取屬性值。 IXMLDOMAttribute 介面有nodeValue 屬性,它等價於作為Microsoft 擴充的nodeValue 和text 屬性。這些屬性傳回: 屬性傳回的文字
attrNode.nodeValue
attrNode.value
getAttribute("name") 傳回和原始文件中完全相同的內容(和擴充的實體)。
attrNode.nodeTypedValue Null
attrNode.text 除了前導和尾部的空白字元已經截斷之外,其他與nodeValue 相同。
「XML 語言」規範為XML 應用程式定義了下列行為: 屬性類型傳回的文字CDATA ID、IDREF、IDREFS、ENTITY、ENTITIES、NOTATION、枚舉
半規範化全規範化
在此半規範化代表將新行和tab 字元轉換為空格,但是多個空格不會退化為一個空格。