1. 程式人生 > >C++ 操作XML的完整例子——MSXML篇

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

寫本文的目的是為了方便大家瞭解C++ MSXML操作方法。

當然,C++中對MSXML的呼叫有多種,本文采用的方法是完全參照MSXML SDK提供的文件進行操作。

如果有什麼錯誤,歡迎指正。

程式碼框架是基於vs2008 MFC 對話方塊程式(UNICODE)。對話方塊程式需要讀者自己建立。

[cpp] view plaincopyprint?
  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

[xhtml] view plaincopyprint?
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <books>
  3. <book>
  4. <name>哈里波特</name>
  5. <price>10</price>
  6. <memo>這是一本很好看的書。</memo>
  7. </book>
  8. <bookid="B02">
  9. <name>三國演義</name>
  10. <price>10</price>
  11. <memo>四大名著之一。</memo>
  12. </book>
  13. <bookid="B03">
  14. <name>水滸</name>
  15. <price>6</price>
  16. <memo>四大名著之一。</memo>
  17. </book>
  18. <bookid="B04">
  19. <name>紅樓</name>
  20. <price>5</price>
  21. <memo>四大名著之一。</memo>
  22. </book>
  23. </books>