写本文的目的是为了方便大家了解C++ MSXML操作方法。
当然,C++中对MSXML的调用有多种,本文采用的方法是完全参照MSXML SDK提供的文档进行操作。
如果有什么错误,欢迎指正。
代码框架是基于vs2008 MFC 对话框程序(UNICODE)。对话框程序需要读者自己创建。
view plaincopy to clipboardprint? #include #pragma comment(lib, \"comsuppwd.lib\") void CXmlSampleDlg::OnBnClickedButton1()//按钮事件 { CoInitialize(NULL); CComPtr 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 hr = spXmldoc->get_documentElement(&spRoot); spRoot->get_xml(&bstrXml); AfxMessageBox(L\"1, 原始的XML\"); AfxMessageBox(bstrXml); spXmldoc->createElement(L\"book\ spXmldoc->createElement(L\"name\ spXmldoc->put_text(L\"新书\"); spTheBook->appendChild(spTheElem, &spNewNode); spTheElem.Release(); spNewNode.Release(); spXmldoc->createElement(L\"price\ spTheElem->put_text(L\"20\"); spTheBook->appendChild(spTheElem, &spNewNode); spTheElem.Release(); spNewNode.Release(); spXmldoc->createElement(L\"memo\ 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 spRoot->selectSingleNode(L\"/books/book[name='哈里波特']\ hr=spTheNode.QueryInterface(&spTheBook); spTheNode.Release(); spTheBook->get_xml(&bstrXml); AfxMessageBox(L\"3,《哈里波特》的XML\"); AfxMessageBox(bstrXml); ////--- 此时修改这本书的价格 ----- CComPtr spListItem->put_text(L\"15\"); ////--- 另外还想加一个属性id,值为B01 ---- CComVariant varId(L\"B01\"); spTheBook->setAttribute(L\"id\ varId.Clear(); spTheBook->get_xml(&bstrXml); spTheBook.Release(); AfxMessageBox(L\"4, 对《哈里波特》修改完成。\"); AfxMessageBox(bstrXml); ////--- 对《哈里波特》修改完成。 ---- ////--- 要用id属性删除《三国演义》这本书 ---- spRoot->selectSingleNode(L\"/books/book[@id='B02']\ hr=spTheNode.QueryInterface(&spTheBook); spTheNode.Release(); spTheBook->get_xml(&bstrXml); AfxMessageBox(L\"5, 《三国演义》的XML\"); AfxMessageBox(bstrXml); CComPtr 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]\ CComQIPtr 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(); } #include #pragma comment(lib, \"comsuppwd.lib\") void CXmlSampleDlg::OnBnClickedButton1()//按钮事件 { CoInitialize(NULL); CComPtr spXmldoc->createElement(L\"book\spXmldoc->createElement(L\"name\spXmldoc->put_text(L\"新书\"); spTheBook->appendChild(spTheElem, &spNewNode); spTheElem.Release(); spNewNode.Release(); spXmldoc->createElement(L\"price\spTheElem->put_text(L\"20\"); spTheBook->appendChild(spTheElem, &spNewNode); spTheElem.Release(); spNewNode.Release(); spXmldoc->createElement(L\"memo\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 spRoot->selectSingleNode(L\"/books/book[name='哈里波特']\hr=spTheNode.QueryInterface(&spTheBook); spTheNode.Release(); spTheBook->get_xml(&bstrXml); AfxMessageBox(L\"3,《哈里波特》的XML\"); AfxMessageBox(bstrXml); ////--- 此时修改这本书的价格 ----- CComPtr CComPtr spListItem->put_text(L\"15\"); ////--- 另外还想加一个属性id,值为B01 ---- CComVariant varId(L\"B01\"); spTheBook->setAttribute(L\"id\varId.Clear(); spTheBook->get_xml(&bstrXml); spTheBook.Release(); AfxMessageBox(L\"4, 对《哈里波特》修改完成。\"); AfxMessageBox(bstrXml); ////--- 对《哈里波特》修改完成。 ---- ////--- 要用id属性删除《三国演义》这本书 ---- spRoot->selectSingleNode(L\"/books/book[@id='B02']\hr=spTheNode.QueryInterface(&spTheBook); spTheNode.Release(); spTheBook->get_xml(&bstrXml); AfxMessageBox(L\"5, 《三国演义》的XML\"); AfxMessageBox(bstrXml); CComPtr 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]\CComQIPtr 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 view plaincopy to clipboardprint? 本文来自CSDN博客,转载http://blog.csdn.net/cds27/archive/2010/04/30/5545455.aspx 请标明出处: 因篇幅问题不能全部显示,请点此查看更多更全内容