热门搜索 :
考研考公
您的当前位置:首页正文

C++操作XML

来源:伴沃教育
 C++ 操作XML的完整例子——MSXML篇 收藏

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

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

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

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

view plaincopy to clipboardprint? #include #include

#pragma comment(lib, \"comsuppwd.lib\")

void CXmlSampleDlg::OnBnClickedButton1()//按钮事件 {

CoInitialize(NULL);

CComPtr 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 spRoot=NULL; CComPtr spTheBook=NULL; CComPtr spTheElem=NULL; CComPtr spNewNode=NULL;

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 spTheNode=NULL;

spRoot->selectSingleNode(L\"/books/book[name='哈里波特']\ hr=spTheNode.QueryInterface(&spTheBook); spTheNode.Release();

spTheBook->get_xml(&bstrXml);

AfxMessageBox(L\"3,《哈里波特》的XML\"); AfxMessageBox(bstrXml);

////--- 此时修改这本书的价格 -----

CComPtr spNodeList=NULL; CComPtr 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.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=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]\ CComQIPtr 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(); }

#include #include

#pragma comment(lib, \"comsuppwd.lib\")

void CXmlSampleDlg::OnBnClickedButton1()//按钮事件 { CoInitialize(NULL); CComPtr 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 spRoot=NULL; CComPtr spTheBook=NULL; CComPtr spTheElem=NULL; CComPtr spNewNode=NULL; 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 spTheNode=NULL;

spRoot->selectSingleNode(L\"/books/book[name='哈里波特']\hr=spTheNode.QueryInterface(&spTheBook); spTheNode.Release();

spTheBook->get_xml(&bstrXml);

AfxMessageBox(L\"3,《哈里波特》的XML\"); AfxMessageBox(bstrXml);

////--- 此时修改这本书的价格 -----

CComPtr spNodeList=NULL;

CComPtr 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.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=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]\CComQIPtr 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

view plaincopy to clipboardprint?

哈里波特 10

这是一本很好看的书。

三国演义 10

四大名著之一。

水浒 6

四大名著之一。

红楼 5

四大名著之一。

本文来自CSDN博客,转载http://blog.csdn.net/cds27/archive/2010/04/30/5545455.aspx

请标明出处:

因篇幅问题不能全部显示,请点此查看更多更全内容

Top