在XML 物件模型中如何處理空白字元?
有些時候,XML 物件模型將顯示包含空白字元的TEXT 節點。空白字符被截斷後,多半會帶來一些混亂。例如下面的XML 範例:
]>
Smith
John
生成下列樹:
Processing Instruction: xml
DocType: person
ELEMENT: person
TEXT:
ELEMENT: lastname
TEXT:
ELEMENT: firstname
TEXT:
名字和姓氏兩邊是只包含空白字元的TEXT 節點,因為「person」元素的內容模型是MIXED;它包含#PCDATA 關鍵字。 MIXED 內容模型指定元素之間可以有文字存在。因此,以下的內容也是正確的:
My last name is Smith and my first name is
John
結果是類似下面的樹:
ELEMENT: person
TEXT: My last name is
ELEMENT: lastname
TEXT: and my first name is
ELEMENT: firstname
TEXT:
如果沒有單字「is」之後和之前的空白字符,以及之後和單字「and」之前的空白字符,那麼句子便無法理解。因此,對於MIXED 內容模型來說,文字組合、空白字元和元素都是相關的。對於非MIXED 內容模型來說則不是這樣。
要讓只有空白字元的TEXT 節點消失,請從「person」元素聲明中刪除#PCDATA 關鍵字:
結果是下面清晰的樹:
Processing Instruction: xml
DocType: person
ELEMENT: person
ELEMENT: lastname
ELEMENT: firstname
XML 聲明做什麼?
XML 聲明必須列在XML 文件的頂部:
它指定下面的項目:
該文件是XML 文件。在遺失或尚未指定MIME 類型時MIME 偵測器可以用它來偵測檔案是否為類型text/xml。
文件符合XML 1.0 規範。在以後XML 有其他版本時這一點很重要。
文檔字符編碼。編碼屬性是可選的,預設為UTF-8。
注意:XML 宣告必須在XML 文件的第一行,因此下面的XML 檔案:
產生下面的分析錯誤:
無效的xml 宣告。
行0000002:
位置 0000007: ------^
注意:XML 聲明是可選的。如果需要在頂部指定註解或處理指令,那麼請不要放入XML 聲明。但是,預設的編碼將為UTF-8。
如何以可讀格式列印我的XML 文件?
在用DOM 從零開始建構文件以產生XML 檔案時,任何內容都在一行上,彼此之間沒有空格。這是預設的行為。
建構在Internet Explorer 5 中的預設XSL 樣式表,以可讀格式顯示和列印XML 文件。例如,如果已經安裝了IE5,請嘗試查看nospace.xml 檔案。瀏覽器中應該會顯示下面的樹:
-
-
XYZ
12.56
在XML 中沒有插入空白字元。
列印可讀XML 是非常有趣的,特別是有定義不同類型內容模型的DTD 時。例如,在混合內容模型(#PCDATA) 下不能插入空格,因為它可能改變內容的意義。例如請考慮下面的XML:
Elephant
這最好不輸出為:
E
lephant
因為單字邊界不再正確。
所有這些都使自動化列印成為問題。如果不需要列印可讀XML,那麼可以使用DOM 在適當的位置插入空白字元作為文字節點。
如何在DTD 中使用名稱空間? 要在DTD 中使用名稱空間,請在使用它的元素的ATTLIST 聲明中聲明它,如下所示:
名稱空間類型必須為#FIXED。屬性的名稱空間也是這樣:
名稱空間和XML 架構DTD 和XML 架構不能混合。例如,下面的
xmlns:x CDATA #FIXED "x-schema:myschema.xml"
將不導致使用在myschema.xml 中定義的架構定義。對DTD 和XML 架構的使用是互斥的。
如何在Visual Basic 中使用XMLDSO?
使用下面的XML 作為範例:
Mark Hanson
206 765 4583
Jane Smith
425 808 1111
可以如下綁定到ADO 記錄集:
建立新的VB 6.0 專案。
新增對Microsoft ActiveX Data Objects 2.1 或更高版本、Microsoft Data Adapter Library 和Microsoft XML 2.0 版的參考。
用下面的程式碼將XML 資料載入到XML DSO 控制項:
Dim dso As New XMLDSOControl
Dim doc As IXMLDOMDocument
Set doc = dso.XMLDocument
doc.Load ("d:test.xml")
用下面的程式碼將DSO 對應到使用DataAdapter 的新記錄集物件中:
Dim da As New DataAdapter
Set da.Object = dso
Dim rs As New ADODB.Recordset
Set rs.DataSource = da
存取數據:
MsgBox rs.Fields("name").Value
結果顯示字串“Mark Hanson”
如何在Java 中使用XML DOM?
必須已經安裝MSXML.DLL 的IE5 版本。在Visual J++ 6.0 中,從專案選單中選擇新增COM 包裝程序,然後從COM 物件清單中選擇「Microsoft XML 1.0」。這個操作將把所需的Java 包裝程式建構到稱為「msxml」的新軟體包中。這些預先建構的Java 包裝程式也可以下載。類別可以如下使用:
import com.ms.com.*;
import msxml.*;
public class Class1
{
public static void main (String[] args)
{
DOMDocument doc = new DOMDocument();
doc.load(new Variant(" file://d:/samples/ot.xml "));
System.out.println("Loaded " + doc.getDocumentElement().getNodeName());
}
}
程式碼範例將從sun religion 範例載入3.8MB 測試檔案「ot.xml」。 Variant 類別用於包裝Win32 VARIANT 基本類型。
因為在每次檢索節點時實際上都獲得了新的包裝程序,因此不能在節點上使用指標比較。因此,不要使用下面的程式碼,
IXMLDOMNode root1 = doc.getDocumentElement();
IXMLDOMNode root2 = doc.getDocumentElement();
if (root1 == root2)...
而要使用下面的程式碼:
if (ComLib.isEqualUnknown(root1, root2)) ....
.class 包裝程式的總大小約為160KB。但是,為了與W3C 規範完全符合,應該只使用IXMLDOM* 包裝程式。下面的類別是舊的IE 4.0 XML 接口,可以從msxml 資料夾中刪除它們:
IXMLAttribute*,
IXMLDocument*, XMLDocument*
IXMLElement*,
IXMLError*,
IXMLElementCollection*,
tagXMLEMEM_TYPE*
_xml_error*
這使大小減少為147KB。同時也可以刪除下面的項目:
DOMFreeThreadedDocument
在Java 應用程式中從多個執行緒存取XML 文件。
XMLHttpRequest
用XML DAV HTTP 擴充與伺服器通訊。
IXTLRuntime
定義XSL 樣式表腳本物件。
XMLDSOControl
綁定到HTML 頁面中的XML 資料。
XMLDOMDocumentEvents
在分析過程中返回回調。
這可以將大小減少到116KB。要使它更小,請考慮DOM 本身有兩層的事實:核心層包括:
DOMDocument, IXMLDOMDocument
IXMLDOMNode*
IXMLDOMNodeList*
IXMLDOMNamedNodeMap*
IXMLDOMDocumentFragment*
IXMLDOMImplementation
IXMLDOMParseError
和使用者可能需要保留的DTD 資訊:
IXMLDOMDocumentType
IXMLDOMEntity
IXMLDOMNotation
XML 文件中的所有節點類型都是IXMLDOMNode,它提供全部功能,但存在每種節點類型的更高層級的包裝程式。因此,如果修改DOMDocument 包裝程式並將這些特定類型變更為使用IXMLDOMNode,那麼所有下面的介面都可以刪除:
IXMLDOMAttribute
IXMLDOMCDATASection
IXMLDOMCharacterData
IXMLDOMComment
IXMLDOMElement
IXMLDOMProcessingInstruction
IXMLDOMEntityReference
IXMLDOMText
刪除這些將使大小減少到61KB。但是,對IXMLDOMElement 來說,getAttribute 和setAttribute 方法都是有用的。否則需要使用:
IXMLDOMNode.getAttributes().setNamedItem(...)