設置 | 登錄 | 註冊

作者共發了4篇帖子。

【代碼】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釋放空間

內容轉換:

回覆帖子
內容:
用戶名: 您目前是匿名發表。
驗證碼:
看不清?換一張
©2010-2025 Purasbar Ver3.0 [手機版] [桌面版]
除非另有聲明,本站採用知識共享署名-相同方式共享 3.0 Unported許可協議進行許可。