zoukankan      html  css  js  c++  java
  • C++中使用DOM写XML文档

    #import <msxml4.dll>

    void Exit()
    {
           CoUninitialize();
    }

    int main(int argc, char *argv[])
    {
           CoInitialize(NULL); // 初始化COM环境
           atexit(Exit);

           MSXML2::IXMLDOMDocumentPtr pDOMDoc;

           pDOMDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40)); // 创建XMLDOMDocument对象

           MSXML2::IXMLDOMProcessingInstructionPtr pDOMPI=pDOMDoc->createProcessingInstruction("xml", "version=\"1.0\""); // 创建XML声明

           pDOMDoc->appendChild(pDOMPI); // 添加XML声明

           MSXML2::IXMLDOMElementPtr pDOMRoot;

           pDOMDoc->raw_createElement((_bstr_t)"China", &pDOMRoot); // 创建[根]节点
           pDOMRoot->setAttribute("Area", "3600000"); // 设置[根]节点属性
           pDOMDoc->appendChild(pDOMRoot); // 向Document中添加根节点

           MSXML2::IXMLDOMElementPtr pDOMNode;

           pDOMDoc->raw_createElement((_bstr_t)"City", &pDOMNode);
           pDOMNode->Puttext("Chongqing"); // 为节点赋值
           pDOMRoot->appendChild(pDOMNode); // 向[根]节点中添加子节点

           pDOMDoc->raw_createElement((_bstr_t)"City", &pDOMNode);
           pDOMNode->Puttext("Beijing");
           pDOMRoot->appendChild(pDOMNode);

           pDOMDoc->save("Test.xml"); // 储存XML Document

           return 0;
    }

    -----------------------------------------------------------------------------xml存在的基础上,读写xml

    CoInitialize(NULL);  
        CComPtr<IXMLDOMDocument> spXmldoc;  
        HRESULT hr = spXmldoc.CoCreateInstance(L"MSXML2.DOMDocument.6.0");  


        if(SUCCEEDED(hr))  
        {  
            VARIANT_BOOL isSuccessFul;  
            CComVariant varXmlFile(L"tlacd.xml");  

            //spXmldoc->put_async(VARIANT_FALSE);  
            HRESULT hr= spXmldoc->load(varXmlFile, &isSuccessFul);  

            if(isSuccessFul==VARIANT_TRUE)  
            {  
                CComBSTR bstrXml;  
                CComPtr<IXMLDOMElement> spRoot=NULL;  
                CComPtr<IXMLDOMElement> spTheBook=NULL;  
                CComPtr<IXMLDOMElement> spTheElem=NULL;  
                CComPtr<IXMLDOMNode> spNewNode=NULL;  

                hr = spXmldoc->get_documentElement(&spRoot);  
                spRoot->get_xml(&bstrXml);  
                AfxMessageBox(L"1, 原始的XML");  
                AfxMessageBox(bstrXml);  


                spXmldoc->createElement(L"book", &spTheBook);  
                spXmldoc->createElement(L"name", &spTheElem);  
                spXmldoc->put_text(L"新书");  
    spTheBook->appendChild(spTheElem, &spNewNode);  
                spTheElem.Release();  
                spNewNode.Release();  

                spXmldoc->createElement(L"price", &spTheElem);  
                spTheElem->put_text(L"20");  
                spTheBook->appendChild(spTheElem, &spNewNode);  
                spTheElem.Release();  
                spNewNode.Release();  

                spXmldoc->createElement(L"memo", &spTheElem);  
                spTheElem->put_text(L"新书的更好看。");  
    spTheBook->appendChild(spTheElem, &spNewNode);  
                spNewNode.Release();  
                spTheElem.Release();  

                spRoot->appendChild(spTheBook, &spNewNode);  
                spNewNode.Release();  
                spTheBook.Release();  

                spRoot->get_xml(&bstrXml);  
                AfxMessageBox(L"2, 新建一本书完成");  
    AfxMessageBox(bstrXml);  
                ////---  新建一本书完成 ----  


    ////---  下面对《哈里波特》做一些修改。 ----  
    ////---  查询找《哈里波特》----  
    CComPtr<IXMLDOMNode> spTheNode=NULL;  
                spRoot->selectSingleNode(L"/books/book[name='哈里波特']", &spTheNode);  
                hr=spTheNode.QueryInterface(&spTheBook);  
                spTheNode.Release();  

                spTheBook->get_xml(&bstrXml);  
                AfxMessageBox(L"3,《哈里波特》的XML");  
                AfxMessageBox(bstrXml);  

                ////---  此时修改这本书的价格 -----  
    CComPtr<IXMLDOMNodeList> spNodeList=NULL;  
                CComPtr<IXMLDOMNode> spListItem=NULL;  
                spTheBook->get_childNodes(&spNodeList);  
                spNodeList->get_item(1, &spListItem);  
                spNodeList.Release();  
                spListItem->put_text(L"15");  

                ////---  另外还想加一个属性id,值为B01 ----  
    CComVariant varId(L"B01");  
                spTheBook->setAttribute(L"id", varId);  
                varId.Clear();  

                spTheBook->get_xml(&bstrXml);  
                spTheBook.Release();  
                AfxMessageBox(L"4, 对《哈里波特》修改完成。");  
    AfxMessageBox(bstrXml);  
                ////---  对《哈里波特》修改完成。 ----  


    ////---  要用id属性删除《三国演义》这本书  ----  
    spRoot->selectSingleNode(L"/books/book[@id='B02']", &spTheNode);  
                hr=spTheNode.QueryInterface(&spTheBook);  
                spTheNode.Release();  

                spTheBook->get_xml(&bstrXml);  
                AfxMessageBox(L"5, 《三国演义》的XML");  
                AfxMessageBox(bstrXml);  

                CComPtr<IXMLDOMNode> spParentNode=NULL;  
                spTheBook->get_parentNode(&spParentNode);  
                spParentNode->removeChild(spTheBook, &spTheNode);  
                spTheNode.Release();  
                spParentNode.Release();  
                spTheBook.Release();  

                spRoot->get_xml(&bstrXml);  
                AfxMessageBox(L"6, 删除《三国演义》后的XML");  
                AfxMessageBox(bstrXml);  


                ////---  再将所有价格低于10的书删除  ----  
    spRoot->selectNodes(L"/books/book[price<10]", &spNodeList);  
                CComQIPtr<IXMLDOMSelection> spSomeBooks=spNodeList;  
                spNodeList.Release();  

                spSomeBooks->removeAll();  
                spSomeBooks.Release();  

                spXmldoc->get_xml(&bstrXml);  
                AfxMessageBox(L"7, 已经删除价格低于10的书");  
    AfxMessageBox(bstrXml);  

                spRoot.Release();  
                bstrXml.Empty();  

                //spXmldoc->save(varXmlFile); //保存xml。  
    }  
    varXmlFile.ClearToZero();  
        }  

        spXmldoc.Release();  

        CoUninitialize();  

  • 相关阅读:
    【SAS NOTE】OUTPUT
    【SAS NOTES】_NULL_
    【SAS NOTE】sas 9.2 安装
    【SAS NOTE】FREQ
    纯数学教程 Page 203 例XLI (1)
    纯数学教程 Page 203 例XLI (3)
    纯数学教程 Page 203 例XLI (2)
    Prove Cauchy's inequality by induction
    纯数学教程 Page 325 例LXVIII (15) 调和级数发散
    纯数学教程 Page 325 例LXVIII (15) 调和级数发散
  • 原文地址:https://www.cnblogs.com/areliang/p/2260566.html
Copyright © 2011-2022 走看看