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

posted on 2011-11-23 17:10 On the way 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/areliang/archive/2011/11/23/2260566.html

猜你喜欢

转载自blog.csdn.net/weixin_34210740/article/details/93610006