微軟XML核心服務MSXML)提供了一組服務,使用戶可以使用JScriptVBScript和其它微軟的開發工具開發基於XML的本機應用程式。它支持XML 1.0、DOMSAXXSLT 1.0,並提供了包括XSDXDR在內的XML schema、XMLHttpRequest、XPath、SOM()等技術。

版本歷史

編輯

MSXML是不同產品的合集。可從此處枚舉各個版本:[1]

現行有效版本

編輯

過時版本

編輯

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->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(_com_error 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(_com_error errorObject)
{
          printf("Exception, HRESULT = 0x%08x", errorObject.Error());
}

IXMLDOMNode

編輯

IXMLDOMNode是通用的節點接口,各種類型節點接口都從它派生,包括IXMLDOMDocument。節點類型包括:

節點類型 示例
NODE_ELEMENT <artist type="band">The Offspring</artist>
NODE_ATTRIBUTE type="band">The Offspring
NODE_TEXT The Offspring
NODE_CDATA_SECTION 示例
NODE_ENTITY_REFERENCE 示例
NODE_ENTITY 示例
NODE_PROCESSING_INSTRUCTION <?xml version="1.0"?>
NODE_COMMENT 示例
NODE_DOCUMENT 示例
NODE_DOCUMENT_TYPE <!DOCTYPE compactdiscs SYSTEM "cds.dtd">
NODE_DOCUMENT_FRAGMENT 示例
NODE_NOTATION 示例

獲取根節點的一種方法:

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);
}

IXMLDOMNodeList

編輯

IXMLDOMNodeList是節點列表的接口,表示一組兄弟(sibling)節點的列表。可以通過index從0開始遍歷列表。列表中的元素還是動態的,會隨着XML文檔的改變而更新。

IXMLDOMNamedNodeMap

編輯

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

IXMLDOMElement

編輯

IXMLDOMElement是元素的接口,一般用來表示一個節點及其屬性。

//获取文档根节点的方法一:
MSXML2::IXMLDOMElementPtr pRootNode = pXmlDoc->documentElement;
//获取文档根节点的方法二:
MSXML2::IXMLDOMElementPtr pRootNode2;
pXmlDoc->get_documentElement(&pRootNode2);

IXMLDOMAttribute

編輯

IXMLDOMAttribute是節點屬性的接口。

IXMLDOMText

編輯

IXMLDOMText是節點的文本的接口。

IXMLDOMComment

編輯

IXMLDOMComment是XML文檔的註釋的接口。

IXMLDOMParseError

編輯

IXMLDOMParseError是XML分析時語法出錯的接口,包括了錯誤的詳細信息。

IXMLDOMImplementation

編輯

IXMLDOMCharacterData

編輯

IXMLDOMCharacterData是字符數據的接口。也是一批基於字符的接口的基類。

IXMLDOMCDATASection

編輯

IXMLDOMCDATASection是CDATA類型的文本的接口。

IXMLDOMDocumentFragment

編輯

IXMLDOMDocumentType

編輯

IXMLDOMProcessingInstruction

編輯

IXMLDOMNotation

編輯

IXMLDOMEntity

編輯

IXMLDOMEntityRefernce

編輯

各種智能指針

編輯

DOM的各種接口一般都有相應的智能指針接口,通常為接口名加上Ptr。例如IXMLDOMDocument的智能指針接口為IXMLDOMDocumentPtr。

C++語言使用

編輯

需要在源程序中加入這行:

#import <msxml6.dll> raw_interfaces_only

這使得在工程(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版本的引用。[6]

然後,在原始碼中輸入:

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" )

參考文獻

編輯
  1. ^ MSXML Version List頁面存檔備份,存於互聯網檔案館) at Microsoft.
  2. ^ MSDN:MSXML版本6可以替代版本4. [2018-01-13]. (原始內容存檔於2018-01-13). 
  3. ^ Office 2010: What's removed: Office 2010 Resource Kit documentation on TechNet. [2018-01-13]. (原始內容存檔於2017-08-26). 
  4. ^ MSXML 4.0 SP3 Release Notes, Microsoft, 2009-09-29 [2011-01-21], (原始內容存檔於2020-08-06) 
  5. ^ MSXML Roadmap, Microsoft, 2013-03-15 [2015-07-11], (原始內容存檔於2018-01-13) 
  6. ^ MSDN:A Beginner's Guide to the XML DOM. [2015-12-02]. (原始內容存檔於2015-12-09).