Loading AI tools
来自维基百科,自由的百科全书
微軟XML核心服務(MSXML)提供了一組服務,使用戶可以使用JScript、VBScript和其它微軟的開發工具開發基於XML的本機應用程式。它支持XML 1.0、DOM、SAX、XSLT 1.0,並提供了包括XSD和XDR在內的XML schema、XMLHttpRequest、XPath、SOM()等技術。
MSXML是不同產品的合集。可從此處枚舉各個版本:[1]
MSXML以COM接口(Interface)的形式提供了一套XML的分析器(parser),從而實現了DOM。
常用的接口:
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是通用的節點接口,各種類型節點接口都從它派生,包括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是節點列表的接口,表示一組兄弟(sibling)節點的列表。可以通過index從0開始遍歷列表。列表中的元素還是動態的,會隨着XML文檔的改變而更新。
IXMLDOMNamedNodeMap是命名節點的無序集合的接口。該接口常用於表示節點的屬性集,並且是動態的。
IXMLDOMElement是元素的接口,一般用來表示一個節點及其屬性。
//获取文档根节点的方法一:
MSXML2::IXMLDOMElementPtr pRootNode = pXmlDoc->documentElement;
//获取文档根节点的方法二:
MSXML2::IXMLDOMElementPtr pRootNode2;
pXmlDoc->get_documentElement(&pRootNode2);
IXMLDOMAttribute是節點屬性的接口。
IXMLDOMText是節點的文本的接口。
IXMLDOMComment是XML文檔的註釋的接口。
IXMLDOMParseError是XML分析時語法出錯的接口,包括了錯誤的詳細信息。
IXMLDOMCharacterData是字符數據的接口。也是一批基於字符的接口的基類。
IXMLDOMCDATASection是CDATA類型的文本的接口。
DOM的各種接口一般都有相應的智能指針接口,通常為接口名加上Ptr。例如IXMLDOMDocument的智能指針接口為IXMLDOMDocumentPtr。
需要在源程序中加入這行:
#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的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
Set objParser = CreateObject( "Microsoft.XMLDOM" )
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.