br>
什麼是 XML?
可擴展標記語言 (XML) 是 Web 上的數據通用語言。它使開發人員能夠將結構化數據,從許多不同的應用程序傳遞到桌面,進行本地計算和演示。XML 允許為特定應用程序創建唯一的數據格式。它還是在服務器之間傳輸結構化數據的理想格式。
什麼是 MSXML?
MSXML 是提供核心 XML 服務的 Microsoft 軟件組件。
Microsoft XML 分析器能夠做什麼?
最新版本的 Microsoft 核心 XML 服務提供下面四種不同的功能。
基於文檔對象模型 (DOM) 的分析器,它能夠獲取文本流(能夠轉換到 XML 的文件、程序中的字符串或者任何其他文本)並將它轉換為能夠編程處理的可導航 XML 樹結構。
SAX(Simple API for XML)分析器,它針對處理大型文檔和高吞吐量的情況進行了優化的。SAX 是基於事件的分析器,它讀取文檔並將分析事件(例如元素的開始和結尾)直接報告給應用程序。用戶創建的應用程序實現了處理不同事件的處理程序,這非常類似於處理圖形用戶界面 (GUI) 中的事件。
XSLT 處理器讀取 XSLT 文件,並將可擴展樣式表轉換語言 (XSLT) 文件的指令應用到 XML 文件,以產生某些類型的輸出。除了創建 XML結構之外,XSLT 處理器還可以在得到的 XSLT 過濾器上執行一定量的優化,另外,從技術的角度看,它更像是一種編譯器。
驗證分析器讀取文檔類型定義 (DTD) 或者 XML 架構,然後檢驗實際得到的文檔的格式是否正確,以及是否不包含與架構沖突的數據。請注意,僅對架構而言,驗證架構將返回架構本身作為對象,可以在以後在 Html 列表框中創建選項時引用這個對象。
所有四種功能都包含在同一 MSXML 庫軟件包中,它可以從 MSDN XML 開發人員中心(英文)免費得到。
MSXML、MSXML2 和 MSXML3 之間的區別是什麼?
在過去三年中 XML 經歷了許多反復,所以目前存在不同版本的 Microsoft XML 分析器也不奇怪。Internet Explorer 4.0 包含早期版本的 XML 分析器,它比 XSL、XML 數據或者大多數其他的 XML 技術(並且有完全不同的 DOM 模型)要早。該早期版本的分析器包含在 MSXML.dll 庫中。從 MSDN XML 開發人員中心(英文)可將分析器升級到較新的一種。
我們極力建議您升級到新的分析器,因為它要強大得多。Internet Explorer 5.0 包括 MSXML 2.0 分析器,它包含 XSL 和 XML 架構的基本版本。MSXML2 是 SQL Server 2000 附帶的分析器版本。MSXML2 包含了許多性能增強的功能,並且在總體上提高了性能和可伸縮性。MSXML3 是當前作為“技術預覽”附帶的版本。MSXML3 包括 XSLT 和 XPath 支持以及 SAX 接口。
XML 可以代替 Html 嗎?
XML 比 HTML 提供更大的靈活性,但是它不可能很快代替 HTML。實際上,XML 和 HTML 能夠很好地在一起工作。Microsoft 希望許多作者和開發人員都能同時使用 XML 和 HTML,比如用 XSLT 來生成 Html。
在 Html 中增加 XML 的好處是什麼?
在 Web 上使用 XML 的好處有:
它提供用於本地計算的數據。傳遞到桌面的數據可以進行本地計算。XML 分析器可以讀取數據,並將它遞交給本地應用程序(例如浏覽器)進一步查看或處理。數據也可以由使用 XML 對象模型的腳本或其他編程語言來處理。
向用戶提供正確的結構化數據視圖。傳遞到桌面的數據可以以多種方式表示。本地數據集,可以根據用戶喜好和配置等因素,以適當的形式,在視圖中動態表現給用戶。
允許集成不同來源的結構化數據。一般情況下,使用代理,在中間層服務器上集成來自後端數據庫和其他應用程序的數據,使該數據能夠傳遞給桌面或者其他服務器,做進一步聚合、處理和分布。
描述來自多種應用程序的數據。由於 XML 是可擴展的,因此它可以用於描述來自多種應用程序的數據,從描述 Web 頁面集合到數據記錄。由於數據是自描述的,因此不需要數據的內置描述,也能夠接收和處理數據。
通過粒度更新來提高性能。XML 允許粒度更新。開發人員不必在每次有改動時都發送整個結構化數據集。有了粒度更新後,只有改變的元素才必須從服務器發送到客戶機。改變的數據可以在不必刷新整個頁面或表的情況下顯示。
XML 只適用於核心開發人員嗎?
不。和 Html 文檔一樣,XML 文檔可以由任何人創建 — 甚至是沒有任何編程經驗的人。XML 僅僅是一種描述信息的標准方式。此外,它還是一種語言,可以在沒有任何軟件的情況下用它來編寫。您可以在文本編輯器中編寫 XML 文檔,並且直接放入 Web 站點,不需要編寫傳統方式下的任何代碼。
開始使用 XML 時需要什麼?
要使用 XML,您需要能夠讀取 XMl 文檔的 XML 分析器,並且使它的內容能被處理。Microsoft 提供了一種分析器,可以從 MSDN XML 開發人員中心(英文)下載。
要使用 XML 文檔,可以使用文本編輯器(例如記事本)或任何其他可以用於創建 Html 頁面的編輯器。要創建完整形式的 XML 應用程序,請使用諸如 Microsoft® Visual Studio® 的編程環境。
有如何使用 XML 的實際例子嗎?
XML 正在數量驚人的應用程序中使用,范圍從 Web 站點創建和文檔化到數據庫集成和分布式編程。在下面幾個領域中,XML 有其用武之地:
業務對業務的傳輸。業務數據(發票、購買定單、會計和稅務信息等等)是以 XML 格式在廠商之間電子傳輸的。與舊的電子數據交換 (EDI) 格式相比,XML 提供了許多優點,而不僅僅是可以在傳輸中從一種發票格式轉換到另一種。
分布式編程。XML 是非常理想的復雜多平台應用程序構造方案,這樣就使得 Windows 服務器和其他操作系統的集成成為可能。
Web 站點體系結構。由於 XML 的層次結構和分布式特性,Web 站點開發人員在他們 Web 站點的總體體系結構和導航結構中越來越多地使用它。此外,越來越多的目錄表和索引表、跟蹤用戶信息及 Web 站點狀態的 XML 結構、基於 Html 的組件和處理數據流的渠道,都用 XML 和 XSLT 編寫。
數據庫操作。XML 正成為與數據庫交互的流行工具 — 無論從 SQL 查詢中檢索 XML 數據集,還是用 XML 記錄更新數據庫。而且我們還有分離實現的優點。通過將數據壓縮為 SML,就不需要對實際的數據庫結構有任何了解。
文檔管理。目前的大多數公司都陷在文書工作的海洋裡,而且會越來越糟。XML 正在越來越多地用於將文檔編碼成 XML,使文檔更易於檢索或提供鏈接到文檔的注釋上下文,以便更有效地進行參考。
我可以忽略 XML 嗎?
如果您想在 Internet 世界中競爭的話,那就不可以忽略 XML。XML 是導致以我們考慮編程本身的方式進行模式轉移的一種語言。傳統的專用客戶機/服務器應用程序,正在給“隨時隨地訪問”的 Internet 服務讓位,XML 是處理任何事情(從數據訪問處理到在該新環境中表現數據)的邏輯媒體。
Microsoft Internet Explorer 4.0 支持 XML 嗎?
是的。Internet Explorer 4.0 支持 XML 下列功能:
通用的 XML 分析器,它讀取 XML 文件並將它們傳遞到應用程序(例如查看器)進行處理。應用程序開發人員可以使用 Microsoft 的兩個分析器:C++ 中的 Microsoft XML 分析和 Java 中的 Microsoft XML 分析器。
XML 對象模型 (XML OM) 使用 World Wide Web Consortium (W3C) 標准文檔對象模型 (DOM) 允許程序通過 XML 分析器訪問結構化數據,使開發人員擁有交互和計算數據的能力。有關詳細信息,請參見 DOM 規范(英文) 。
XML 數據源對象 (XML DSO) 允許開發人員連接到結構化 XML 數據,並用動態 HTML 的數據綁定機制將它提供給 Html 頁面。
Internet Explorer 5.0 對 XML 提供哪個級別的支持?
Internet Explorer 5 提供下列 XML 支持:
直接查看 XML。Microsoft XML 實現允許用戶通過他們的 Web 浏覽器使用 XSL 或者層疊樣式表 (CSS) 查看 XML,就象查看 Html 文檔一樣。
高性能、驗證 XML 引擎。Internet Explorer 4.0 開發人員熟悉的 XML 引擎已經得到了很大的增強,並且完全支持 W3C XML 1.0 和 XML 名稱空間,這樣開發人員就可以在 Web 上統一限定元素名稱,從而避免了相同名稱的元素之間的沖突。Windows 中的本機 XML 支持意味著,當開發人員在應用程序和組件之間移動數據時,可以使用完整的 XML 處理功能來讀取和處理數據。
可擴展樣式轉換語言 (XSLT) 支持。使用基於最新的 W3C Working Draft 的 Microsoft XSLT 處理器,開發人員可以對 XML 數據應用樣式表,並以易於自定義的動態和靈活方式來顯示數據。Microsoft XSLT 處理器的查詢功能也允許開發人員用程序,在客戶機或服務器上,在 XML 數據集內部查找和摘取信息。
XML 架構。架構(英文) 定義 XML 文檔規則,包括元素名稱和豐富的數據類型,它們的元素可以表現為組合,並且每個元素的屬性都可用。為了啟用多層應用程序,Microsoft 將根據提交給 W3C XML 工作組的縮減 XML 數據架構 (XDR) 來發布 XML 架構的技術預覽。
服務器端 XML。服務器端 XML 處理允許使用 XML 作為在多個分布式應用程序服務器(甚至是跨越操作系統邊界)之間傳送數據的標准方式。
XML 文檔對象模型 (DOM)。XML DOM 是標准對象應用程序編程接口,它使開發人員能夠用程序控制 XML 文檔內容、結構、格式等等。Microsoft XML 實現包括對 W3C XML DOM 建議的完全支持,並且可以用腳本、Visual Basic 開發系統、C++ 和其他編程語言來訪問。
C++ XML 數據源對象。XML DSO 允許將 Html 元素直接綁定到 XML 數據島。此外,它還提高了性能,有強大的能力可以綁定到不同 XML 節點上,而且利用了 Internet Explorer 5 beta 中所有的新的數據綁定功能。
HTML、動態 Html 和 XML 之間的關系是什麼?
HTML 可以和 CSS 一起用於格式化和表示超鏈接頁面。動態 HTML,通過 DOM,使 Html 中的所有元素,都可以通過與語言無關的腳本和其他編程語言來訪問,從而在很大程度上提高了客戶機端的交互能力,而且不需要對服務器的額外需求。頁面的對象模型允許動態更改任何方面的內容(包括增加、刪除和移動)。
通過為結構化數據添加 XML,為開發人員提供了構造下一代豐富、靈活 Web 應用程序的技術。使用 XML,他們可以為桌面提供結構化數據,並且用 XML 對象模型計算數據。現在的開發人員可以在浏覽器(例如 Microsoft Internet Explorer 4.0 和 Microsoft Internet Explorer 5)或者其他應用程序中,通過腳本顯示基於 XML 的數據。此外,他們也可以對數據應用格式化規則,而不需要使用 XSLT 樣式表的復雜腳本(實際上是將基於 XML 的數據轉換為顯示)。這兩種顯示基於 XML 數據的方法,都使得生成復雜數據的多個視圖成為可能。
為什麼 XML 這麼重要?
XML 將成為計算領域的未來。作為一種技術,它的影響力將滲透到編程的每個方面,從嵌入式系統到圖形界面,到分布式系統以及數據庫管理。它實際上已經成為軟件工業之間數據通信的標准,並且迅速代替 EDI 系統成為全球幾乎所有工業進行業務交換的主要媒體。它很有可能會成為創建和存儲大多數文檔的語言,不管是否在 Internet 上,並且有可能成為 Internet 應用程序服務器的基礎,有些人相信它將代替許多目前生產的小包裝產品。
Microsoft 提供什麼 XML 產品?
Microsoft 正在努力為許多領域開發 XML 資源:
數據訪問。最新的 ActiveX® 數據對象 (ADO) 的化身,已經支持 XML 的生成和消費將近一年了,並且 Microsoft SQL Server 2000 為基於 SQL 的信息和 XML 之間的互相轉換提供了許多接口。
浏覽器支持。Microsoft 是第一個生產能夠閱讀 XML 文件(無論是用原始結構形式,還是通過 XSL 或 CSS 樣式表)的商業浏覽器 (Internet Explorer 5) 的公司。
BizTalk Server 2000。Microsoft® BizTalk(TM) Server 2000 提供了在大量不同格式(包括 XML)之間通信的方式,來幫助推動業務對業務的應用程序。BizTalk Server 也包括了許多架構生成和映射工具,從而大大簡化了業務或商業需要的 XML 結構的開發。
在 Web 上傳輸,必須壓縮 XML 嗎?
一般來說,壓縮 XML 的需要是與應用程序有關的,並且很大程度上是服務器和客戶機之間移動數據量的函數。用於描述數據結構的標記的反復特性,使 XML 能夠非常好地壓縮數據。值得注意的是 HTTP 1.1 服務器和客戶機的壓縮都是標准的,XML 可以自動從中受益。
XML 作為數據格式有多安全?有沒有增加 XML 安全性的計劃?
XML 和 HTML 一樣安全。正因為安全的 HTTP (HTTPS) 可以用於對 HTTP 添加密碼技術,從而保護了 Html,因此它也可以用於保護 XML。XML 是表示結構化數據的基於文本格式。這可以使數據的簡單性和互操作性最大化。對 XML 格式增加安全性和驗證能力時可以采取許多步驟。首先,XML 可以在傳輸到客戶之前在服務器上加密,然後在客戶機上解密。應用於數據本身的數字簽名也可以驗證 XML。
確認
什麼是 DTD 及其用途?
文檔類型定義 (DTD) 定義了一類 XML 文檔的正確語法。也就是說,它列出了許多元素名稱,什麼元素可以和其他元素一起顯示,什麼屬性可以用於每種元素類型等等。DTD 使用 XML 文檔使用的不同語法形式。
Web 開發人員在使用 XML 描述數據時必須包括 DTD 嗎?
不。XML 可以用於描述有或沒有 DTD 的數據。術語“有效”XML 指代引用 DTD 的 XML 數據,而“良好形成的”XML 是未使用 DTD 的 XML。此外,“良好形成的”XML 還是 XML 和標准統一標記語言 (SGML) 的基本區別之一。很明顯,在這兩種情況下,XML 本身都必須遵守語言的標准(例如,所有標記都必須是閉合的,並且標記不能重疊)。
什麼是 XML 架構?它們與 DTD 的區別是什麼?
雖然 XML 1.0 提供了定義 XML 文檔的內容模型的機制 — DTD — 但是很明顯還需要定義內容模型的更全面更有效的方法。XML 架構是特殊的 XML 結構的定義(從其組織和數據類型兩個方面)。XML 架構使用“XML 架構”語言來指定在架構中如何定義元素的每種類型,以及與元素關聯的數據類型。與 DTD 相比,架構的最鮮明的特點,便是架構本身就是 XML 文檔。這意味著閱讀它所描述的 XML 的工具也可以閱讀它。
Microsoft 的 XML 服務目前支持 XML 數據架構,它代表了在 1999 年 3 月 Internet Explorer 5 裝運時 “W3C 架構”活動的快照。XML 數據架構允許開發人員在他們的 XML 文檔中添加數據類型,以及定義開放的內容模型。這種對 DTD 功能的擴展對 XML 編程很關鍵。
但是 W3C 正在准備“XML 架構定義 (XSD)”,它將成為“XML 架構標准”。Microsoft 計劃在此規范成為建議後,立即使對“XML 架構定義 (XSD)”的支持成為它核心 XML 服務的一部分。
什麼是名稱空間,它們為何重要?
名稱空間是 XML 的另一個高級功能,並作為 XML 1.0 規范的一部分,在 W3C 筆記中作了概述。它們允許開發人員限定元素名稱和關系。名稱空間使元素名稱唯一可識別,從而避免了名稱相同,但是在不同詞典中定義的元素之間發生名稱沖突。它們允許混合來自不同名稱空間的標記,這一點對多個來源的數據很重要。
例如,書店可以定義
名稱空間有助於清晰地定義這種差別。
XSLT 和 XPATH
什麼是 XSLT?
XSLT(英文) ,或者用於轉換的可擴展樣式表語言,它是在 1999 年 11 月 6 日獲得批准的 W3C 建議。從標記和編程兩重意義上說,這種語言提供了將 XML 結構轉換到其他 XML 結構、Html 或者任何數量的其他文本格式(例如 SQL)的機制。雖然它可以用於創建 Web 頁面的顯示輸出,但是 XSLT 的實際功能在於能夠改變底層結構,而不是簡單地改變這些結構的媒體表示,就像在層疊樣式表 (CSS) 中一樣。
XSL、XQL、XSL 模式 和 XSLT 之間的區別是什麼?
XSLT 源自 CSS 在對 XML 文檔結構改動上的局限性,當時創建 XML 的原因更傾向於代替 Html 而不是提供通用數據描述語言。因此可擴展樣式表語言 (XSL) 成為構造格式化 XML 新方法的成果。
但是,“W3C 樣式工作”組的成員和早期 XML 采用者很快就發現,能夠將 XML 從一種格式轉換到另一個格式的語言,可以極大地簡化生成的大量代碼。Microsoft 向 W3C 提交了一個建議,最初名稱為 XML 查詢語言(或 XQL),它隨之被 W3C 采納為 XSL 模式語言。該語言的大多數功能最終都被納入了 XSLT 規范中。
最終標准結合了為不同初始條件而修改的 XSLT 參數,創建代碼功能塊的命名模板,以及大量用於數值和字符串處理的增強功能。XSLT 還為在語言中添加內置功能提供方便,提供了 Microsoft 可在自己的實現中用來添加許多極其有用功能(包括訪問 COM 對象和腳本)的產品。
什麼是 XPath?
XPath(英文) 是為 XML 定義的查詢語言,它提供在文檔中選擇節點子集的簡單語法。通過 XPath,通過指定類似於目錄的路徑(即名稱)以及路徑中的條件,可以檢索元素集合。XPath 對 XSLT 和 XML DOM 都很重要,並與 XPointer 規范(允許根據統一資源定位符 [URL] 和 XPath 表達式的組合來選擇文檔片斷)有聯系。
為什麼 XSLT 對 XML 很重要?
XSLT 是將一種 XML 文檔轉換為另一種的語言。這意味著它提供了單源 XML 數據的機制,可以在 Web 頁面中創建由用戶動態更改的豐富視圖,可以為目標通信過濾數據。XSLT 對於業務規則編碼已經足夠強大。它可以從數據生成圖形(不僅僅是 Web 頁面)。它甚至可以處理與其他服務器的通信 — 特別是和能夠集成到 XSLT 中的腳本模塊協作 — 以及在 XSLT 自身內部生成適當的消息。雖然它不可能代替桌面系統中的大多數交互(出於性能和使用方便性兩方面分原因),但是在未來的幾年中,XSLT 很有可能最終成為系統之間進行通信的主要“編程”語言。
XSLT 和 CSS 之間的區別是什麼?它們不是樣式表嗎?
層疊樣式表 (CSS) 的任務是對 Html 元素指定一組顯示屬性。CSS 決定了頁面的視覺外觀,但是不會改變源文檔的結構。
另一方面,XSLT 也稱為基於模板的語言,它允許將某種模式映射到源文檔中,該源文檔的輸出是用 XML、Html 或純文本書寫的。使用 XSLT,可以將 XML 文檔的結構轉換為不同的 XML 文檔。例如,您可以更改 XML 文檔的順序、添加或刪除元素、執行條件測試或者用元素的集合進行迭代。
XSLT 和 CSS 不是兼容標准。一種在 XML 中創建 Web 頁面的有用技術,是用 XSLT 將 XML 轉換為諸如列表或表的結構,然後將 CSS 應用於結果,控制這些結構在適當媒體中的顯示。您甚至可以從 XSLT 創建 CSS。
標准
Microsoft 如何與 XML 標准兼容?
從 XML 語言開始產生起,Microsoft 就站在了 XML 的最前沿,而且很值得注意的是,W3C 在過去幾年中所生成的大多數 XML 建議和工作草案,都包括來自至少一個(在某些情況下可能是數個)Microsoft 職員的輸入和參與。Microsoft 已經多次被委以重任,與 W3C 標准組織一起,確保 XML 的開發能使所有用戶受益,並且在許多不同領域的開發中都作出了重要貢獻,包括 XML 規范、DOM、XSLT 和架構定義語言。Microsoft 承諾將與最新規范和標准保持一致。
XML 和 World Wide Web Consortium (W3C) 之間的關系是什麼?
W3C 有一活躍的 XML 工作組。Microsoft 從 1996 年 6 月起就是該組織的共同發起者之一,從那時起許多業界企業都開始加入,包括 Netscape Communications Corp.、IBM 和 Oracle。有關 XML 標准過程的詳細信息,請訪問 W3C Web 站點(英文)。
XML 和 W3C 的地位關系如何?
XML 1.0 是在 1998 年 12 月被正式批准的,現在仍是個穩定的標准。有關當前 XML 規范的詳細信息以及 W3C 內部的提交和審閱過程,請參見 W3C Web 站點(英文)。
DOM 在 W3C 中的地位如何?
>DOM Level 1 的 W3C 文檔狀態為“推薦”。這說明 W3C 目前正在提議將它作為 World Wide Web 上的標准。有關 DOM 和在 W3C 內部提交和審閱過程的詳細信息,請參見 DOM 規范(英文)。
工具支持
SQL Server 和 ADO 支持 XML 嗎?
Microsoft ActiveX 數據對象 (ADO) 技術,提供許多將數據庫記錄集(數據記錄集合)轉換為 XML 格式的方法,以及從給定結構中獲取 XML 並將其轉換回 ADO 所支持數據庫(包括 SQL Server 和 Oracle 數據庫)的工具。此外,通過 MSXML2 和 MSXML3 中的 XML 數據源對象,還可以將任意 XML 直接加載到 ADO 中以生成記錄集。
SQL Server 2000 還允許通過 URL 直接設置和檢索 XML,方式和調用 Web 頁面非常相似。這是處理數據的強大機制,因為它基本上意味著可以將 SQL Server 數據直接集成到 XML 過濾器和 Web 頁面,基本上凡是有 XML 文檔的地方都可以集成 SQL Server 數據。此外,還可以設置自定義模板,來控制如何從 SQL Server 數據中產生 XML,使數據庫成為生成 XHtml 頁面的強大工具。
最後,諸如 BizTalk Server 這樣的應用程序還允許在任意數量的不同數據源(從 XML 文檔到數據庫到 Excel 和 Word 文檔)之間進行映射、為 Web 體系結構創建復雜數據管道以及根據 XML 數據庫需求構造有效的架構。
目前有 Microsoft 工具可以幫助我快速沿用 XML 嗎?
Microsoft BizTalk Server 2000 是用於數據交換的、基於 XML 的服務器,它提供啟用電子商務業務社會的基本結構和工具。BizTalk Server 的基礎是基於規則的業務文檔路由、轉換和跟蹤基本結構。該基本結構允許公司通過在組織邊界之內或之間的應用程序中間交換業務文檔,例如購買定單和發票,來集成、管理和自動化業務過程。有關詳細信息,請參見Microsoft BizTalk Server 2000(英文) 。
什麼是 SOAP?
SOAP 是簡單對象訪問協議,是創建大范圍分布式、復雜計算環境的工具,該計算環境可使用現有的 Internet 基本結構運行在 Internet 上。SOAP 可以使應用程序用許許多多方法在 Internet 上互相直接通信。有關 SOAP 的詳細信息,請參見 SOAP 規范(英文)。
XML 如何適用於 Microsoft Windows® Distributed InterNet Applications (Windows DNA) 策略來構造三層並具有 Web 功能的應用程序?
XML 正在快速成為將結構化數據從中間層傳送到桌面的工具。基於 XML 的數據可以通過中間層代理與多種後端(數據庫)源集成。架構(參見“XML 數據”一節)可以改進該過程,並且開發人員可以更精確地描述和交換數據。
問題和解決方案
為什麼在調用了 Load() 方法後,我的文檔對象仍然為空?
默認情況下操作是異步加載的。這意味著如果提供 http URL 地址,那麼 load() 方法將直接返回,並且文檔對象仍然為空,因為數據還沒有從服務器返回。為了糾正這個問題,請在代碼中添加下面的行:
XMLdoc.async = false;
同時,如果是從獨立的 C++ 應用程序加載 http XML 文檔,那麼必須查詢消息隊列才能繼續加載。
如何加載有外國和特殊字符的文檔?
文檔可以包含外國字符,例如:
foreign characters (úóí&yUML;)
例如 磲 的外國字符必須在前面加上 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 is loaded preserveWhiteSpace=true preserveWhiteSpace=true preserveWhiteSpace=false preserveWhiteSpace=false
xml:space=preserve xml:space=default xml:space=preserve XML:space=default
半保留 半保留並截斷 半保留 半保留並截斷
此處的保留表示和原始 XML 文檔中完全相同的原始文本內容,截斷意味著前導和尾部空格已經刪除,半保留意味著保留了“重要的空白字符”並規范化了“不重要的空白字符”。重要的空白字符是文本內容內部的空白字符。不重要的空白字符是標記之間的空白字符,請看如下所示:
\n
\t Jane\n
\tSmith \n
在本示例中,紅色是可以忽略的不重要的空白字符,而綠色是重要的空白字符,因為它是文本內容的一部分,因此有不可忽略的重要含義。所以在本例中,文本屬性返回下列結果:
狀態 返回值
保留 "\n\t Jane\n\tSmith \n"
保留並截斷 "Jane\n\tSmith"
半保留 " 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
\t\n
">
]>
&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 字符轉換為空格,但是多個空格不會退化為一個空格。
在 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(...)