首页 > 代码库 > VC MSXML 操作 XML 入门
VC MSXML 操作 XML 入门
最近对XML有了些兴趣,准备稍稍涉猎一下。百度了相关的文章,试着写了一个程序,记录下来以资备忘。
我的开发环境:Win7 32位OS、VS2012。
OK,开始动手。
PS:至于相关理论之类的就让大神大仙大侠大牛们去操心吧,我么就秉承拿来主义,能用就行啦。
启动Visual Studio 2012。
【文件】→【新建】→【项目】
新建一个“MfcXmlTest”的MFC项目。【确定】
【下一步】
选中“基于对话框”,取消“使用Unicode库”。可直接【完成】
PS:Unicode对中文支持不是很好。
热身完成,开始进入正题。
先画一个简单的程序界面。
里面添加了中文,测试是否对中文支持。
各控件属性:
控件ID | 变量类型 | 变量名称 |
IDC_EDIT_ID | CString | m_strId |
IDC_EDIT_BOOK | CString | m_strBook |
IDC_EDIT_AUTHOR | CString | m_strAuthor |
IDC_BUTTON_GENERATE | 生成XML | |
IDC_BUTTON_LOAD | 加载XML |
进入代码编写阶段。
在StdAfx.h中引入动态链接库 MSXML6.DLL(C:/windows/system32/msxml6.dll)
可在文件最后添加:
// Win7系统自带MSXML6版本,不同OS请依照对应的版本,也可自行安装 #import <msxml6.dll>
双击“生成XML”按钮,完成如下代码:
// 按钮:生成XML void CMfcXmlTestDlg::OnBnClickedButtonGenerate() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); MSXML2::IXMLDOMDocumentPtr pDoc; // xml文档 MSXML2::IXMLDOMElementPtr xmlRoot; // 根节点 MSXML2::IXMLDOMElementPtr pElement, pElement1; // 元素 MSXML2::IXMLDOMNodePtr pNode=NULL; // 节点 MSXML2::IXMLDOMProcessingInstructionPtr pProInstruction = NULL; // xml声明 // 创建DOMDocument对象 HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument60)); // MSXML6版本 if (!SUCCEEDED(hr)) { MessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!"); return; } // 创建xml文档声明:<?xml version="1.0" encoding="utf-8"?> pProInstruction = pDoc->createProcessingInstruction((_bstr_t)(char*)"xml", (_bstr_t)(char*)"version=\"1.0\" encoding=\"utf-8\""); pDoc->appendChild(pProInstruction); // 根节点的名称为:图书馆 xmlRoot = pDoc -> createElement((_bstr_t)"图书馆"); pDoc -> PutRefdocumentElement(xmlRoot); /* -------- 运行结果 -------- <?xml version="1.0" encoding="utf-8"?> <图书馆> <Book ID="321"> <书名>BookName</书名> <作者>BookAuthor</作者> </Book> </图书馆> */ // 节点的名称为Book pElement = pDoc -> createElement((_bstr_t)"Book"); // 设置属性 pElement -> setAttribute( "ID" ,( const char * )m_strId); xmlRoot -> appendChild(pElement); // 添加“书名”元素 pElement1 = pDoc -> createElement((_bstr_t) "书名" ); pElement1 -> Puttext((_bstr_t)( const char * )m_strBook); pElement -> appendChild(pElement1); // 添加“作者”元素 pElement1 = pDoc -> createElement( "作者" ); pElement1 -> Puttext(( const char * )m_strAuthor); pElement -> appendChild(pElement1); /* -------- 运行结果 -------- <图书馆> <Book> <ID>123</ID> <书名>BookName</书名> <作者>BookAuthor</作者> </Book> </图书馆> // 添加“Book”节点 pNode = pDoc->createNode((_variant_t)(long)NODE_ELEMENT, (_bstr_t)(char*)"Book", (_bstr_t)(char*)""); xmlRoot -> appendChild(pNode); // 添加“ID”元素 pElement = pDoc -> createElement((_bstr_t) "ID" ); pElement -> Puttext((_bstr_t)( const char * )m_strId); pNode -> appendChild(pElement); // 添加“书名”元素 pElement = pDoc -> createElement((_bstr_t) "书名" ); pElement -> Puttext((_bstr_t)( const char * )m_strBook); pNode -> appendChild(pElement); // 添加“作者”元素 pElement = pDoc -> createElement( "作者" ); pElement -> Puttext(( const char * )m_strAuthor); pNode -> appendChild(pElement); */ // 保存到文件。如果不存在就建立,存在就覆盖 pDoc -> save("d://Book.xml"); }
双击“加载XML”按钮,完成如下代码:
// 按钮:加载XML void CMfcXmlTestDlg::OnBnClickedButtonLoad() { // TODO: 在此添加控件通知处理程序代码 /* -------- XML 内容 -------- <?xml version="1.0" encoding="utf-8"?> <图书馆> <Book ID="321"> <书名>BookName</书名> <作者>BookAuthor</作者> </Book> </图书馆> */ // 清空控件内容 m_strId.Empty(); m_strBook.Empty(); m_strAuthor.Empty(); UpdateData(FALSE); // 变量值—>控件显示 MSXML2::IXMLDOMDocumentPtr pDoc; HRESULT hr; hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument60)); if (FAILED(hr)) { MessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!"); return; } // 加载文件 pDoc -> load("d://Book.xml"); // 选择内容的根节点 MSXML2::IXMLDOMElementPtr pElem = NULL; pElem = pDoc -> selectSingleNode("//图书馆"); if(pElem==NULL) { return; } // 搜索“图书馆”中“Book”的数量(本例只有一本) int nBookNum = pElem->childNodes->length; if( nBookNum == 0) { return; } // 遍历所有Book for(int i=0; i < nBookNum; i++) { MSXML2::IXMLDOMNodePtr pBookNode = pElem->childNodes->item[i]; if(pBookNode==NULL) { return; } //读取Book节点的“ID”属性 MSXML2::IXMLDOMNodePtr pId = pBookNode->attributes->getNamedItem("ID"); m_strId=(LPCTSTR)pId->text; // 类型转换 _bstr_t → CString //读取book节点下“书名”子节点 MSXML2::IXMLDOMNodePtr pBook = pBookNode->selectSingleNode("书名"); if(pBook==NULL) { //cout<<"Author: Error\t"; } else { m_strBook=(LPCTSTR)pBook->text; } //读取book节点下“作者”子节点 MSXML2::IXMLDOMNodePtr pAuthor = pBookNode->selectSingleNode("作者"); if(pAuthor==NULL) { //cout<<"Author: Error\t"; } else { m_strAuthor=(LPCTSTR)pAuthor->text; } } // for(int i=0; i < nBookNum; i++) UpdateData(FALSE); }
到了激动人心的最终时刻啦!
按下F7生成程序,如果一切顺利,再按下F5走起。
运行效果如图:
\(≧▽≦)/~啦啦啦
本人调试的时候也蹦出了一个异常:
仔细看去,原来是MSXML的版本没有改为自己电脑的MSXML6版本。望诸位留意。
PS:参考了不少网友的大作,一并表示感谢!
http://blog.csdn.net/max2008/article/details/1647613
http://www.newxing.com/Tech/Program/Cpp/703.html
http://www.cnblogs.com/xiaoyusmile/p/3920075.html
本文出自 “xingziying” 博客,请务必保留此出处http://xingziying.blog.51cto.com/9815611/1602161
VC MSXML 操作 XML 入门