C++ 操作XML的完整例子——MSXML篇

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

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

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

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

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

a.xml

  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>

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值