目前共有4篇帖子。 內容轉換:不轉換▼
 
點擊 回復
308 3
【代码】C++使用msxml6来创建XML文件并保存(程序未使用任何MFC或ATL类库)
一派護法 十九級
1樓 發表于:2016-1-28 18:35
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <comutil.h>
#include <iostream>
#include <MsXml6.h>

#pragma comment(lib, "comsuppw.lib")
#pragma comment(lib, "msxml6.lib")

using namespace std;

void CreateXMLFile(IXMLDOMDocument *pXMLDoc);

int _tmain(int argc, _TCHAR* argv[])
{
    // 初始化COM
    HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
    if (FAILED(hr))
        return 1;
    
    // 创建XML文档对象
    IXMLDOMDocument *pXMLDoc;
    hr = CoCreateInstance(CLSID_DOMDocument60, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pXMLDoc));
    if (SUCCEEDED(hr))
    {
        CreateXMLFile(pXMLDoc);
        pXMLDoc->Release();
    }
    else
        cout << "创建XMLDOMDocument对象失败" << endl;

    CoUninitialize();
    system("pause");
    return 0;
}

void CreateXMLFile(IXMLDOMDocument *pXMLDoc)
{
    /* 在文档中创建XML声明 */
    IXMLDOMProcessingInstruction *pProInstruction;
    pXMLDoc->createProcessingInstruction(L"xml", L"version=\"1.0\" encoding=\"utf-8\"", &pProInstruction);
    pXMLDoc->appendChild(pProInstruction, NULL);
    pProInstruction->Release();

    /* 在文档中创建根节点<book> */
    IXMLDOMElement *pBookElement;
    pXMLDoc->createElement(L"book", &pBookElement);
    pXMLDoc->appendChild(pBookElement, NULL); // 把根节点加入到文档中

    /* 给根节点<book>添加id属性*/
    pBookElement->setAttribute(L"id", variant_t(448));

    /* 给根节点<book>添加子节点<name>和<price> */
    IXMLDOMElement *pBookNameElement;
    IXMLDOMElement *pBookPriceElement;
    pXMLDoc->createElement(L"name", &pBookNameElement);
    pXMLDoc->createElement(L"price", &pBookPriceElement);
    pBookNameElement->put_text(L"JavaScript开发技术大全");
    pBookPriceElement->put_text(L"$65");
    pBookElement->appendChild(pBookNameElement, NULL);
    pBookElement->appendChild(pBookPriceElement, NULL);
    pBookNameElement->Release();
    pBookPriceElement->Release();
    pBookElement->Release();

    /* 保存XML文件 */
    HRESULT hr = pXMLDoc->save(variant_t("file.xml"));
    if (FAILED(hr))
        cout << "XML文件保存失败" << endl;
}
一派護法 十九級
2樓 發表于:2016-1-28 18:36
生成的XML文件内容如下:
<?xml version="1.0" encoding="utf-8"?>
<book id="448"><name>JavaScript开发技术大全</name><price>$65</price></book>
文件编码为UTF8。
一派護法 十九級
3樓 發表于:2016-1-28 18:44
如果字符串变量是char *类型或TCHAR类型的话,那么在传入参数的时候可以加一个bstr_t。例如:
char *str = "PHP从入门到精通";
pBookNameElement->put_text(bstr_t(str));

TCHAR *str = TEXT("PHP从入门到精通");
pBookNameElement->put_text(bstr_t(str));

wchar_t *变量直接传入参数就行了:
wchar_t *str = L"PHP从入门到精通";
pBookNameElement->put_text(str);

因为MSXML中的函数要求传入的字符串必须是宽字符类型。所以建议一般的字符串常量用L,字符串变量根据情况决定是否用bstr_t。
一派護法 十九級
4樓 發表于:2016-5-24 20:50
不过MSDN上说最好不要直接将wchar_t *字符串传入函数中,最好先SysAllocString后再传进去,最后SysFreeString释放空间

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
(快捷鍵:Ctrl+Enter)
 

本帖信息

點擊數:308 回複數:3
評論數: ?
作者: 巨大八爪鱼
最後回復:巨大八爪鱼
最後回復時間:2016-5-24 20:50
 
©2010-2024 Arslanbar Ver2.0
除非另有聲明,本站採用創用CC姓名標示-相同方式分享 3.0 Unported許可協議進行許可。