MSXML

微软XML核心服务（MSXML）提供了一组服务，使用户可以使用JScript、VBScript和其它微软的开发工具开发基于XML的本机应用程序。它支持XML 1.0、DOM、SAX、XSLT 1.0，并提供了包括XSD和XDR在内的XML schema、XMLHttpRequest、XPath、SOM（）等技术。
版本历史.
MSXML是不同产品的合集。可从此处枚举各个版本： 
DOM.
MSXML以COM接口（Interface）的形式提供了一套XML的分析器（parser），从而实现了DOM。
常用的接口：
IXMLDOMDocument.
IXMLDOMDocument是XML文档接口，是DOM树结构的根结点。
//声明并创建一个IXMLDOMDocument的智能指针：
MSXML2::IXMLDOMDocumentPtr pXmlDoc;
HRESULT hr = pXmlDoc.CreateInstance( __uuidof(MSXML2::DOMDocument60), NULL, CLSCTX_INPROC_SERVER);
if( FAILED(hr))
 printf("Failed to create DOM document interface pointer.\n");
//加载xml文件代码为： 
try
 pXmlDoc-&gt;async = VARIANT_FALSE; // 使用阻塞式同步加载xml文件。默认是异步方式加载，还需要检查IXMLDOMDocument的ReadyState，这特别适用于从网络上加载。 
 pXmlDoc-&gt;validateOnParse = VARIANT_FALSE;//加载xml文件时，是否依据xml文件中指明的DTD或schema检查xml文件的结构
 pXmlDoc-&gt;resolveExternals = VARIANT_FALSE;//分析xml时，外部定义或ocument type definition(DTD)等不被处理
 if( pXmlDoc-&gt;load("test.xml") != VARIANT_TRUE)
 printf("Fail reason: %s\n", (LPCSTR)pXmlDoc-&gt;parseError-&gt;Getreason());
 else
 // success
catch(_com_error errorObject)
 printf("Exception, HRESULT = 0x%08x", errorObject.Error());
//保存xml文件：
try
 if( FAILED( pXmlDoc-&gt;save(L"myData.xml")))
 printf("Fail reason: %s\n", (LPCSTR)pXmlDoc-&gt;parseError-&gt;Getreason());
 else
 // success
catch(_com_error errorObject)
 printf("Exception, HRESULT = 0x%08x", errorObject.Error());
IXMLDOMNode.
IXMLDOMNode是通用的节点接口，各种类型节点接口都从它派生，包括IXMLDOMDocument。节点类型包括：
获取根节点的一种方法：
MSXML2::IXMLDOMNodePtr pRootNode, pTempNode;
pXmlDoc-&gt;get_firstChild(&amp;pRootNode);
while( pRootNode)
 MSXML2::DOMNodeType type;
 pRootNode-&gt;get_nodeType(&amp;type);
 if(type==NODE_ELEMENT) // 如果是element节点，而不是注释、回车符等
 break; //找到了根节点
 pTempNode = pRootNode;
 pTempNode-&gt;get_nextSibling(&amp;pRootNode);
IXMLDOMNodeList.
IXMLDOMNodeList是节点列表的接口，表示一组兄弟（sibling）节点的列表。可以通过index从0开始遍历列表。列表中的元素还是动态的，会随着XML文档的改变而更新。
IXMLDOMNamedNodeMap.
IXMLDOMNamedNodeMap是命名节点的无序集合的接口。该接口常用于表示节点的属性集，并且是动态的。
IXMLDOMElement.
IXMLDOMElement是元素的接口，一般用来表示一个节点及其属性。
//获取文档根节点的方法一：
MSXML2::IXMLDOMElementPtr pRootNode = pXmlDoc-&gt;documentElement;
//获取文档根节点的方法二：
MSXML2::IXMLDOMElementPtr pRootNode2;
pXmlDoc-&gt;get_documentElement(&amp;pRootNode2);
IXMLDOMAttribute.
IXMLDOMAttribute是节点属性的接口。
IXMLDOMText.
IXMLDOMText是节点的文本的接口。
IXMLDOMComment.
IXMLDOMComment是XML文档的注释的接口。
IXMLDOMParseError.
IXMLDOMParseError是XML分析时语法出错的接口，包括了错误的详细信息。
IXMLDOMCharacterData.
IXMLDOMCharacterData是字符数据的接口。也是一批基于字符的接口的基类。
IXMLDOMCDATASection.
IXMLDOMCDATASection是CDATA类型的文本的接口。
各种智能指针.
DOM的各种接口一般都有相应的智能指针接口，通常为接口名加上Ptr。例如IXMLDOMDocument的智能指针接口为IXMLDOMDocumentPtr。 
C++语言使用.
需要在源程序中加入这行：
这使得在工程（Project）的编译文件夹下生成msxml6.tlh和msxml6.tli两个文件，分别相当于COM接口的头文件与实现文件。“raw_interfaces_only”属性使得生成的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" &amp; _
 "due the following error." &amp; vbCrLf &amp; _
 "Error #: " &amp; .errorCode &amp; ": " &amp; .reason &amp; _
 "Line #: " &amp; .Line &amp; vbCrLf &amp; _
 "Line Position: " &amp; .linepos &amp; vbCrLf &amp; _
 "Position In File: " &amp; .filepos &amp; vbCrLf &amp; _
 "Source Text: " &amp; .srcText &amp; vbCrLf &amp; _
 "Document URL: " &amp; .url
 End With
 MsgBox strErrText, vbExclamation
End If
Set xDoc = Nothing
VBScript使用.
 Set objParser = CreateObject( "Microsoft.XMLDOM" )