MSXML

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

版本历史

MSXML是不同产品的合集。可从此处枚举各个版本:[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[2],但不能替代版本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。

过时版本

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). 
圖形介面
音樂與音效
多媒體
Web
資料存取
網路
通訊
  • 訊息API英语Messaging Application Programming Interface
  • 電話API
  • WCF
管理
元件與模型
函式庫
驱动程序
安全性
.NET
软件工廠
  • EFx Factory英语EFx Factory
  • Enterprise Library英语Microsoft Enterprise Library
  • 複合使用者介面英语Composite UI Application Block
  • CCF英语Microsoft Customer Care Framework
  • CSF英语Microsoft Connected Services Framework
行程間通訊
可協助性
  • Active Accessibility英语Microsoft Active Accessibility
  • 使用者介面自動化英语Microsoft UI Automation
文字與多語系支援
  • DirectWrite
  • 文本服务框架英语Text Services Framework
  • 文本对象模型英语Text Object Model
  • 输入法编辑器
  • 語言介面套件英语Language Interface Pack
  • 多語系使用者介面英语Multilingual User Interface
  • Uniscribe
遊戲開發
Internet Explorer
版本英语Internet Explorer versions
主要版本
其它版本
概覽
技術
軟件與引擎
實現
  • Active Channel英语Active Channel
  • 活动桌面
  • ActiveMovie
  • 频道定义格式英语Channel Definition Format(.cdf)
  • Comic Chat/Chat 2.0英语Microsoft Comic Chat
  • DirectX Media英语DirectX Media
  • Internet邮件和新闻
  • Microsoft Java虛擬機器(MSJVM)
  • MSN Explorer英语MSN Explorer
  • MSN for Mac OS X英语MSN for Mac OS X
  • NetMeeting英语Microsoft NetMeeting
  • NetShow英语NetShow
  • Outlook Express
  • 服务器网关加密英语Server gated cryptography(SGC)
  • Spyglass
  • Windows通讯录英语Windows Address Book
  • Windows桌面更新
人物
事件
相關
  • 分类 分類
  • 共享资源页面 共享資源
  • 微软主题
  • 互联网主题