MSXML

微軟 XML 核心服務（MSXML）提供了一組服務，使使用者可以使用 JScript、VBScript 和其它微軟的開發工具開發基於 XML 的本機應用程式。它支援 XML 1.0、DOM、SAX、XSLT 1.0，並提供了包括 XSD 和 XDR 在內的 XML schema、XMLHttpRequest、XPath、SOM等技術。

版本歷史

MSXML 是不同產品的合集。可從此處列舉各個版本：

1.1 現行有效版本

MSXML 6.0 MSXML6 是最新版本。與 MSXML3 一起隨 Microsoft SQL Server 2005、Visual Studio 2005、.NET Framework 3.0、Windows Vista、Windows XP Service Pack 3 發行。支援 64 位本地環境。版本 6 可以替代版本 4，但不能替代版本 3。MSXML 6 不支援 Windows 9x。
MSXML 3.0 對應於 msxml3.dll。MSXML 3.0 SP2 隨 Windows XP、Internet Explorer 6.0 與 MDAC 2.7 發行。Windows XP SP2 包含 MSXML 3.0 SP5，作為 MDAC 2.81 的一部分。Internet Explorer 版本 6.0、7.0、8.0 使用 MSXML 3 解析 XML 文件。MSXML 3.0 SP7 是 Windows 95 支援的最高版本。Windows XP SP3 包含 MSXML 3.0 SP9。Windows Vista 包含 MSXML 3.0 SP10。

1.2 過時版本

MSXML 5.0 隨 Microsoft Office 2003 與 Office 2007 釋出。Microsoft 沒有釋出 5.0 的文件，因為 MSXML 5 僅為 Office 2003 與 2007 內部使用。Office 2010 不包含 MSXML 5.0。
MSXML 4.0 隨獨立的、可下載的 SDK 釋出，不能完全相容版本 3.0 。只有 32 位版本。MSXML 4.0 SP3 是最高版本。並於 2014 年 4 月過期。
MSXML 2.6 隨 Microsoft SQL Server 2000 與 MDAC 2.6 釋出，對應於 msxml2.dll，最後版本為 KB887606 .

MSXML 2.5 隨 Windows 2000 中的 Internet Explorer 5.01 與 MDAC 2.5 釋出。對應於 msxml.dll
MSXML 2.0a 隨 Internet Explorer 5.0 釋出
MSXML 1.0 隨 Internet Explorer 4.0 釋出

DOM

MSXML 以 COM 介面（Interface）的形式提供了一套 XML 的分析器（parser），從而實現了 DOM。

常用的介面：

2.1 IXMLDOMDocument

IXMLDOMDocument 是 XML 文件介面，是 DOM 樹結構的根結點。

// 宣告並建立一個 IXMLDOMDocument 的智慧指標：

MSXML2::IXMLDOMDocumentPtr pXmlDoc;

HRESULT hr = pXmlDoc.CreateInstance (uuidof (MSXML2::DOMDocument60), NULL, CLSCTXINPROCSERVER);

if (FAILED (hr))

printf ("Failed to create DOM document interface pointer.\n");

// 載入 xml 檔案程式碼為：

try

{pXmlDoc->async = VARIANT_FALSE; // 使用阻塞式同步載入 xml 檔案。預設是非同步方式載入，還需要檢查 IXMLDOMDocument 的 ReadyState，這特別適用於從網路上載入。

pXmlDoc->validateOnParse = VARIANT_FALSE;// 載入 xml 檔案時，是否依據 xml 檔案中指明的 DTD 或 schema 檢查 xml 檔案的結構

pXmlDoc->resolveExternals = VARIANT_FALSE;// 分析 xml 時，外部定義或 ocument type definition (DTD) 等不被處理

if (pXmlDoc->load ("test.xml") != VARIANT_TRUE)

{printf ("Fail reason: % s\n", (LPCSTR) pXmlDoc->parseError->Getreason );

}

else

{//success}

}

catch (comerror errorObject)

{printf ("Exception, HRESULT = 0x%08x", errorObject.Error );

}

// 儲存 xml 檔案：

try

{if ( FAILED ( pXmlDoc->save (L"myData.xml")))

{printf ("Fail reason: % s\n", (LPCSTR) pXmlDoc->parseError->Getreason );

}

else

{//success}

}

catch (comerror errorObject)

{printf ("Exception, HRESULT = 0x%08x", errorObject.Error );

}

2.2 IXMLDOMNode

IXMLDOMNode 是通用的節點介面，各種型別節點介面都從它派生，包括 IXMLDOMDocument。節點型別包括：

獲取根節點的一種方法：

MSXML2::IXMLDOMNodePtr pRootNode, pTempNode;

pXmlDoc->get_firstChild (&pRootNode);

while (pRootNode)

{

MSXML2::DOMNodeType type;

pRootNode->get_nodeType (&type);

if (type==NODE_ELEMENT) // 如果是 element 節點，而不是註釋、回車符等

break; // 找到了根節點

pTempNode = pRootNode;

pTempNode->get_nextSibling (&pRootNode);

}

2.3 IXMLDOMNodeList

IXMLDOMNodeList 是節點列表的介面，表示一組兄弟（sibling）節點的列表。可以透過 index 從 0 開始遍歷列表。列表中的元素還是動態的，會隨著 XML 文件的改變而更新。

2.4 IXMLDOMNamedNodeMap

IXMLDOMNamedNodeMap 是命名節點的無序集合的介面。該介面常用於表示節點的屬性集，並且是動態的。

2.5 IXMLDOMElement

IXMLDOMElement 是元素的介面，一般用來表示一個節點及其屬性。

// 獲取文件根節點的方法一：

MSXML2::IXMLDOMElementPtr pRootNode = pXmlDoc->documentElement;

// 獲取文件根節點的方法二：

MSXML2::IXMLDOMElementPtr pRootNode2;

pXmlDoc->get_documentElement (&pRootNode2);

2.6 IXMLDOMAttribute

IXMLDOMAttribute 是節點屬性的介面。

2.7 IXMLDOMText

IXMLDOMText 是節點的文字的介面。

2.8 IXMLDOMComment

IXMLDOMComment 是 XML 文件的註釋的介面。

2.9 IXMLDOMParseError

IXMLDOMParseError 是 XML 分析時語法出錯的介面，包括了錯誤的詳細資訊。

2.10 IXMLDOMImplementation

2.11 IXMLDOMCharacterData

IXMLDOMCharacterData 是字元資料的介面。也是一批基於字元的介面的基類。

2.12 IXMLDOMCDATASection

IXMLDOMCDATASection 是 CDATA 型別的文字的介面。

2.13 IXMLDOMDocumentFragment

2.14 IXMLDOMDocumentType

2.15 IXMLDOMProcessingInstruction

2.16 IXMLDOMNotation

2.17 IXMLDOMEntity

2.18 IXMLDOMEntityRefernce

2.19 各種智慧指標

DOM 的各種介面一般都有相應的智慧指標介面，通常為介面名加上 Ptr。例如 IXMLDOMDocument 的智慧指標介面為 IXMLDOMDocumentPtr。

C++ 語言使用

需要在源程式中加入這行：

import rawinterfacesonly

這使得在工程（Project）的編譯資料夾下生成 msxml6.tlh 和 msxml6.tli 兩個檔案，分別相當於 COM 介面的標頭檔案與實現檔案。“rawinterfacesonly” 屬性使得生成的 msxml6.tlh 中，各個結構中只包含返回型別為 HRESULT 的介面函式，並且介面函式名省去了 raw字首；如果不用該屬性，則預設是在各個結構中聲明瞭一套帶 raw字首的返回 HRESULT 型別的介面函式以及不帶 raw字首的返回各種 VARIANT型別的 wrapper 介面函式。

也可以透過連線輸入庫檔案 msxml6.lib 來使用。

作為 COM 庫，線上程的開頭與結束之處需要分別呼叫 COM 環境的初始化與去初始化函式：CoInitialize、CoUninitialize。

MSXML 的各種資源都放在了 MSXML2 名字空間（namespace）中。

Visual Basic 使用

首先在 Visual Basic 的 Project 上開啟 Add Reference 對話方塊，在 COM 標籤頁（tab）中，增加 “Microsoft, v6.0” 的引用。也可以選擇 4.0 或 5.0 版本的引用。

然後，在原始碼中輸入：

Dim xDoc As MSXML.DOMDocument

Set xDoc = New MSXML.DOMDocument

'If xDoc.Load ("http://www.develop.com/hp/brianr/cds.xml") Then

If xDoc.Load ("C:\My Documents\cds.xml") Then

' The document loaded successfully.

' Now do something intersting.

Else

' The document failed to load.

Dim strErrText As String

Dim xPE As MSXML.IXMLDOMParseError

' Obtain the ParseError object

Set xPE = xDoc.parseError

With xPE

strErrText = "Your XML Document failed to load" & _

"due the following error." & vbCrLf & _

"Error #:" & .errorCode & ":" & .reason & _

"Line #:" & .Line & vbCrLf & _

"Line Position:" & .linepos & vbCrLf & _

"Position In File:" & .filepos & vbCrLf & _

"Source Text:" & .srcText & vbCrLf & _

"Document URL:" & .url

End With

MsgBox strErrText, vbExclamation

End If

Set xDoc = Nothing

VBScript 使用

Set objParser = CreateObject ("Microsoft.XMLDOM")