MS XML 文档创建

    要使用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>




   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章