惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Martin Fowler
Martin Fowler
WordPress大学
WordPress大学
月光博客
月光博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
大猫的无限游戏
大猫的无限游戏
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 聂微东
Apple Machine Learning Research
Apple Machine Learning Research
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
雷峰网
雷峰网
小众软件
小众软件
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 叶小钗
美团技术团队
宝玉的分享
宝玉的分享
Hugging Face - Blog
Hugging Face - Blog
阮一峰的网络日志
阮一峰的网络日志
A
About on SuperTechFans
Jina AI
Jina AI
D
Docker
Last Week in AI
Last Week in AI
MongoDB | Blog
MongoDB | Blog
Stack Overflow Blog
Stack Overflow Blog
Microsoft Azure Blog
Microsoft Azure Blog

博客园 - On the way

做产品16年,我有9条心得--百度贴吧前负责人 toB的产品经理和toc产品经理区别 Stack overflow 编译能通过,运行时出现Stack overflow VC2008操作Excel2007总结 VC++ MSXML创建XML文件以及对XML文档解析 MFC中的MainFrame Dlg,App,Doc,View的关系 于typedef的用法总结 C++/CLI与C#常用语法对比 理解lvalue和rvalue 讲讲volatile的作用 利用C++/CLI 封装Native C++ 提升.NET web game性能 规格单位换算 C/C++中宏使用总结 Working with XML in a Classic COM Application - On the way 位图和矢量图区别 WIKI扫盲手册 C#的显式接口和隐式接口 软件设计的七大原则 ASP.NET下MVC设计模式的实现
C++中使用DOM写XML文档
On the way · 2011-11-23 · via 博客园 - On the way

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