要使用MS XML 首先要进行注册msxml(n).dll, 因为MS 已经封装成COM了。现在那MsXML4.dll 为例。
1.首先加载COM:
::CoInitialize(NULL);
2.然后进行IXMLDOMDocument指针的获取,其实就是获得XML DOM 对象:
IUnknown *pUnKnown = NULL;
MSXML2::IXMLDOMDocument *pDomDoc = NULL;
HRESULT hr = CoCreateInstance(__uuidof(MSXML2::DOMDocument30),
NULL, CLSCTX_INPROC_SERVER,
__uuidof(IUnknown), (void ** )&pUnKnown);
if (FAILED (hr))
{
::MessageBeep(0xFFFFFFFF);
}
hr = pUnKnown->QueryInterface(__uuidof(MSXML2::IXMLDOMDocument), (void**) &pDomDoc);
if (FAILED (hr))
{
::MessageBeep(0xFFFFFFFF);
}
pUnKnown->Release();
3. 然后进行节点对象的创建
_bstr_t strFileE = "RootNode";
_bstr_t strSend = "SendNode";
_bstr_t strThid = "Third";
_bstr_t Value = "Value";
_variant_t valueS = "1";
_variant_t valueT = "2";
IXMLDOMElementPtr pFristNode = pDomDoc->createElement(strFileE);
pDomDoc->appendChild(pFristNode);
IXMLDOMElementPtr pSend = pDomDoc->createElement(strSend);
pSend->setAttribute(Value, valueS);
IXMLDOMElementPtr pThird = pDomDoc->createElement(strThid);
pThird->setAttribute(Value, valueT);
pFristNode->appendChild(pSend);
pFristNode->appendChild(pThird);
4. 文档保存:
pDomDoc->save(vt);
5.文档修饰:
因为现在直接存贮,XML是将其存为一行,要让其美观,我们还要加进去/n/t;这样修改如下:
IXMLDOMElementPtr pFristNode = pDomDoc->createElement(strFileE);
pDomDoc->appendChild(pFristNode);
pFristNode->appendChild(pDomDoc->createTextNode(ValueLine));
IXMLDOMElementPtr pSend = pDomDoc->createElement(strSend);
IXMLDOMElementPtr pThird = pDomDoc->createElement(strThid);
pSend->setAttribute(Value, valueS);
pThird->setAttribute(Value, valueT);
pFristNode->appendChild(pSend);
pFristNode->appendChild(pDomDoc->createTextNode(ValueLine));
pFristNode->appendChild(pThird);
pFristNode->appendChild(pDomDoc->createTextNode(ValueLine1));
最后整个源程序:
// testxml.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#import "msxml4.dll"
using namespace MSXML2;
int main(int argc, char* argv[])
{
::CoInitialize(NULL);
// IXMLDOMDocumentPtr
IUnknown *pUnKnown = NULL;
MSXML2::IXMLDOMDocument *pDomDoc = NULL;
HRESULT hr = CoCreateInstance(__uuidof(MSXML2::DOMDocument30),
NULL, CLSCTX_INPROC_SERVER,
__uuidof(IUnknown), (void ** )&pUnKnown);
if (FAILED (hr))
{
::MessageBeep(0xFFFFFFFF);
}
hr = pUnKnown->QueryInterface(__uuidof(MSXML2::IXMLDOMDocument), (void**) &pDomDoc);
if (FAILED (hr))
{
::MessageBeep(0xFFFFFFFF);
}
pUnKnown->Release();
pDomDoc->async = VARIANT_FALSE;
_variant_t vt = "D://test.xml";
VARIANT_BOOL bRet = pDomDoc->load(vt);
if (FALSE == bRet)
{
//TRACE0("Open error");
}
_bstr_t strFileE = "RootNode";
_bstr_t strSend = "SendNode";
_bstr_t strThid = "Third";
_bstr_t Value = "Value";
_variant_t valueS = "1";
_variant_t valueT = "2";
_bstr_t ValueLine = "/n/t";
_bstr_t ValueLine1 = "/n";
IXMLDOMElementPtr pFristNode = pDomDoc->createElement(strFileE);
pDomDoc->appendChild(pFristNode);
pFristNode->appendChild(pDomDoc->createTextNode(ValueLine));
IXMLDOMElementPtr pSend = pDomDoc->createElement(strSend);
IXMLDOMElementPtr pThird = pDomDoc->createElement(strThid);
pSend->setAttribute(Value, valueS);
pThird->setAttribute(Value, valueT);
pFristNode->appendChild(pSend);
pFristNode->appendChild(pDomDoc->createTextNode(ValueLine));
pFristNode->appendChild(pThird);
pFristNode->appendChild(pDomDoc->createTextNode(ValueLine1));
pDomDoc->save(vt);
pFristNode->Release();
pSend->Release();
pThird->Release();
pFristNode = NULL;
pSend = NULL;
pThird = NULL;
pDomDoc->Release();
::CoUninitialize();
return 0;
}
其中pDomDoc 没有使用xml中只能指针IXMLDOMDocumentPtr,这里主要是讨论使用,其实在自己封装类的时候,
最后使用智能指针,因为简单而且不易出错。
xml文档的样子:
<RootNode>
<SendNode Value="1"/>
<Third Value="2"/>
</RootNode>