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();  

  • 相关阅读:
    洛谷P5979 [PA2014]Druzyny
    洛谷P5592 美德的讲坛
    BZOJ4231 回忆树
    Python爬虫〇二———从几个简单的爬虫开始
    Flink实例(115):自定义时间和窗口的操作符(十四)窗口操作符(四)触发器(Triggers) (二)
    商业化数据分析师(三十二):平台商品画像实战项目(三)购物篮分析
    商业化数据分析师(三十一):平台商品画像实战项目(二)如何构建商品画像-- 以移动电源为例
    商业化数据分析师(三十):平台商品画像实战项目(一)简介
    商业化数据分析师(二十九):平台用户画像实战项目(二)如何构建平台用户的用户画像
    商业化数据分析师(二十八):平台用户画像实战项目(一)什么是用户画像体系以及商户用户画像和平台用户画像的区别
  • 原文地址:https://www.cnblogs.com/areliang/p/2260566.html
Copyright © 2011-2022 走看看