Chinaunix首页 | 论坛 | 博客
  • 博客访问: 249007
  • 博文数量: 83
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 410
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-22 10:11
文章分类
文章存档

2016年(2)

2014年(2)

2013年(65)

2012年(14)

我的朋友

分类: C/C++

2013-04-22 17:50:04

写本文的目的是为了方便大家了解C++ MSXML操作方法。

当然,C++中对MSXML的调用有多种,本文采用的方法是完全参照MSXML SDK提供的文档进行操作。

如果有什么错误,欢迎指正。

 

代码框架是基于vs2008 MFC 对话框程序(UNICODE)。对话框程序需要读者自己创建。

  1. #include    
  2. #include    
  3. #pragma comment(lib, "comsuppwd.lib")   
  4. void CXmlSampleDlg::OnBnClickedButton1()//按钮事件   
  5. {  
  6.     CoInitialize(NULL);  
  7.     CComPtr spXmldoc;  
  8.     HRESULT hr = spXmldoc.CoCreateInstance(L"MSXML2.DOMDocument.6.0");  
  9.   
  10.     if(SUCCEEDED(hr))  
  11.     {  
  12.         VARIANT_BOOL isSuccessFul;  
  13.         CComVariant varXmlFile(L"a.xml");  
  14.   
  15.         spXmldoc->put_async(VARIANT_FALSE);  
  16.         HRESULT hr= spXmldoc->load(varXmlFile, &isSuccessFul);  
  17.   
  18.         if(isSuccessFul==VARIANT_TRUE)  
  19.         {  
  20.             CComBSTR bstrXml;  
  21.             CComPtr spRoot=NULL;  
  22.             CComPtr spTheBook=NULL;  
  23.             CComPtr spTheElem=NULL;  
  24.             CComPtr spNewNode=NULL;  
  25.   
  26.             hr = spXmldoc->get_documentElement(&spRoot);  
  27.             spRoot->get_xml(&bstrXml);  
  28.             AfxMessageBox(L"1, 原始的XML");  
  29.             AfxMessageBox(bstrXml);  
  30.   
  31.   
  32.             spXmldoc->createElement(L"book", &spTheBook);  
  33.             spXmldoc->createElement(L"name", &spTheElem);  
  34.             spXmldoc->put_text(L"新书");  
  35.             spTheBook->appendChild(spTheElem, &spNewNode);  
  36.             spTheElem.Release();  
  37.             spNewNode.Release();  
  38.   
  39.             spXmldoc->createElement(L"price", &spTheElem);  
  40.             spTheElem->put_text(L"20");  
  41.             spTheBook->appendChild(spTheElem, &spNewNode);  
  42.             spTheElem.Release();  
  43.             spNewNode.Release();  
  44.   
  45.             spXmldoc->createElement(L"memo", &spTheElem);  
  46.             spTheElem->put_text(L"新书的更好看。");  
  47.             spTheBook->appendChild(spTheElem, &spNewNode);  
  48.             spNewNode.Release();  
  49.             spTheElem.Release();  
  50.   
  51.             spRoot->appendChild(spTheBook, &spNewNode);  
  52.             spNewNode.Release();  
  53.             spTheBook.Release();  
  54.   
  55.             spRoot->get_xml(&bstrXml);  
  56.             AfxMessageBox(L"2, 新建一本书完成");  
  57.             AfxMessageBox(bstrXml);  
  58.             ////---  新建一本书完成 ----   
  59.   
  60.   
  61.             ////---  下面对《哈里波特》做一些修改。 ----   
  62.             ////---  查询找《哈里波特》----   
  63.             CComPtr spTheNode=NULL;  
  64.             spRoot->selectSingleNode(L"/books/book[name='哈里波特']", &spTheNode);  
  65.             hr=spTheNode.QueryInterface(&spTheBook);  
  66.             spTheNode.Release();  
  67.   
  68.             spTheBook->get_xml(&bstrXml);  
  69.             AfxMessageBox(L"3,《哈里波特》的XML");  
  70.             AfxMessageBox(bstrXml);  
  71.   
  72.             ////---  此时修改这本书的价格 -----   
  73.             CComPtr spNodeList=NULL;  
  74.             CComPtr spListItem=NULL;  
  75.             spTheBook->get_childNodes(&spNodeList);  
  76.             spNodeList->get_item(1, &spListItem);  
  77.             spNodeList.Release();  
  78.             spListItem->put_text(L"15");  
  79.   
  80.             ////---  另外还想加一个属性id,值为B01 ----   
  81.             CComVariant varId(L"B01");  
  82.             spTheBook->setAttribute(L"id", varId);  
  83.             varId.Clear();  
  84.   
  85.             spTheBook->get_xml(&bstrXml);  
  86.             spTheBook.Release();  
  87.             AfxMessageBox(L"4, 对《哈里波特》修改完成。");  
  88.             AfxMessageBox(bstrXml);  
  89.             ////---  对《哈里波特》修改完成。 ----   
  90.   
  91.   
  92.             ////---  要用id属性删除《三国演义》这本书  ----   
  93.             spRoot->selectSingleNode(L"/books/book[@id='B02']", &spTheNode);  
  94.             hr=spTheNode.QueryInterface(&spTheBook);  
  95.             spTheNode.Release();  
  96.   
  97.             spTheBook->get_xml(&bstrXml);  
  98.             AfxMessageBox(L"5, 《三国演义》的XML");  
  99.             AfxMessageBox(bstrXml);  
  100.   
  101.             CComPtr spParentNode=NULL;  
  102.             spTheBook->get_parentNode(&spParentNode);  
  103.             spParentNode->removeChild(spTheBook, &spTheNode);  
  104.             spTheNode.Release();  
  105.             spParentNode.Release();  
  106.             spTheBook.Release();  
  107.   
  108.             spRoot->get_xml(&bstrXml);  
  109.             AfxMessageBox(L"6, 删除《三国演义》后的XML");  
  110.             AfxMessageBox(bstrXml);  
  111.   
  112.   
  113.             ////---  再将所有价格低于10的书删除  ----   
  114.             spRoot->selectNodes(L"/books/book[price<10]", &spNodeList);  
  115.             CComQIPtr spSomeBooks=spNodeList;  
  116.             spNodeList.Release();  
  117.   
  118.             spSomeBooks->removeAll();  
  119.             spSomeBooks.Release();  
  120.   
  121.             spXmldoc->get_xml(&bstrXml);  
  122.             AfxMessageBox(L"7, 已经删除价格低于10的书");  
  123.             AfxMessageBox(bstrXml);  
  124.   
  125.             spRoot.Release();  
  126.             bstrXml.Empty();  
  127.   
  128.             //spXmldoc->save(varXmlFile); //保存xml。   
  129.         }  
  130.         varXmlFile.ClearToZero();  
  131.     }  
  132.   
  133.     spXmldoc.Release();  
  134.   
  135.     CoUninitialize();  

转载地址:

http://blog.csdn.net/cds27/article/details/5545455

阅读(2352) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~