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>