要使用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));
最后整个源程序:
<RootNode>
<SendNode Value="1"/>
<Third Value="2"/>
</RootNode>
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; }
xml文档的样子:
其中pDomDoc 没有使用xml中只能指针IXMLDOMDocumentPtr,这里主要是讨论使用,其实在自己封装类的时候,
最后使用智能指针,因为简单而且不易出错。
<RootNode>
<SendNode Value="1"/>
<Third Value="2"/>
</RootNode>