MSXML解析[转]

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

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

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

 

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

 

[cpp]  view plain copy
 
  1. #include <msxml6.h>  
  2. #include <comutil.h>  
  3. #pragma comment(lib, "comsuppwd.lib")  
  4. void CXmlSampleDlg::OnBnClickedButton1()//按钮事件  
  5. {  
  6.     CoInitialize(NULL);  
  7.     CComPtr<IXMLDOMDocument> 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<IXMLDOMElement> spRoot=NULL;  
  22.             CComPtr<IXMLDOMElement> spTheBook=NULL;  
  23.             CComPtr<IXMLDOMElement> spTheElem=NULL;  
  24.             CComPtr<IXMLDOMNode> 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.             spTheElem->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<IXMLDOMNode> 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<IXMLDOMNodeList> spNodeList=NULL;  
  74.             CComPtr<IXMLDOMNode> 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<IXMLDOMNode> 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<IXMLDOMSelection> 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();  
  136. }  

 

 

a.xml

 

[xhtml]  view plain copy
 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <books>  
  3.  <book>  
  4.   <name>哈里波特</name>  
  5.   <price>10</price>  
  6.   <memo>这是一本很好看的书。</memo>  
  7.  </book>  
  8.  <book id="B02">  
  9.   <name>三国演义</name>  
  10.   <price>10</price>  
  11.   <memo>四大名著之一。</memo>  
  12.  </book>  
  13.  <book id="B03">  
  14.   <name>水浒</name>  
  15.   <price>6</price>  
  16.   <memo>四大名著之一。</memo>  
  17.  </book>  
  18.  <book id="B04">  
  19.   <name>红楼</name>  
  20.   <price>5</price>  
  21.   <memo>四大名著之一。</memo>  
  22.  </book>  
  23. </books>   

 

转载于:https://www.cnblogs.com/Dennis-mi/articles/3465397.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值