最近对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
转载于:https://blog.51cto.com/xingziying/1602161