C++ 操作XML的完整例子——MSXML篇
阿新 • • 發佈:2019-01-29
寫本文的目的是為了方便大家瞭解C++ MSXML操作方法。
當然,C++中對MSXML的呼叫有多種,本文采用的方法是完全參照MSXML SDK提供的文件進行操作。
如果有什麼錯誤,歡迎指正。
程式碼框架是基於vs2008 MFC 對話方塊程式(UNICODE)。對話方塊程式需要讀者自己建立。
[cpp] view plaincopyprint?- #include <msxml6.h>
- #include <comutil.h>
- #pragma comment(lib, "comsuppwd.lib")
- void CXmlSampleDlg::OnBnClickedButton1()
- {
- CoInitialize(NULL);
- CComPtr<IXMLDOMDocument> spXmldoc;
- HRESULT hr = spXmldoc.CoCreateInstance(L"MSXML2.DOMDocument.6.0");
- if(SUCCEEDED(hr))
- {
- VARIANT_BOOL isSuccessFul;
- CComVariant varXmlFile(L"a.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);
- spTheElem->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();
- }
a.xml
[xhtml] view plaincopyprint?- <?xmlversion="1.0"encoding="UTF-8"?>
- <books>
- <book>
- <name>哈里波特</name>
- <price>10</price>
- <memo>這是一本很好看的書。</memo>
- </book>
- <bookid="B02">
- <name>三國演義</name>
- <price>10</price>
- <memo>四大名著之一。</memo>
- </book>
- <bookid="B03">
- <name>水滸</name>
- <price>6</price>
- <memo>四大名著之一。</memo>
- </book>
- <bookid="B04">
- <name>紅樓</name>
- <price>5</price>
- <memo>四大名著之一。</memo>
- </book>
- </books>