微软XML核心服务MSXML)提供了一组服务,使用户可以使用JScriptVBScript和其它微软的开发工具开发基于XML的本机应用程序。它支持XML 1.0、DOMSAXXSLT 1.0,并提供了包括XSDXDR在内的XML schema、XMLHttpRequest、XPath、SOM()等技术。

版本历史 编辑

MSXML是不同产品的合集。可从此处枚举各个版本:[1]

现行有效版本 编辑

过时版本 编辑

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