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

  • 相关阅读:
    OpenCV3 for python3 学习笔记1
    OpenCV3 for python3 学习笔记2
    python3 requests获取某网站折线图上数据
    python BeautifulSoup的简单使用
    Python爬虫之Cookie和Session(转载)
    python 获取前一天或前N天的日期
    python 进程池pool简单使用
    GitHub for Windows简单使用
    Windows上的git、github部署及基本使用方法
    python unknown error: DevToolsActivePort file doesn't exist 问题解决
  • 原文地址:https://www.cnblogs.com/areliang/p/2260566.html
Copyright © 2011-2022 走看看