VC编程之VC MSXML 操作 XML 入门
小标 2018-09-04 来源 : 阅读 945 评论 0

摘要:本文主要向大家介绍了VC编程之VC MSXML 操作 XML 入门,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

本文主要向大家介绍了VC编程之VC MSXML 操作 XML 入门,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

最近对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”按钮,完成如下代码:

// 按钮:生成XMLvoid 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”按钮,完成如下代码:

// 按钮:加载XMLvoid 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版本。望诸位留意。


本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言VC/MFC频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程