Win10系列:VC++ XML文件解析

Win10 并行配置错误深度解析:从 SxSTrace 日志到 WinSxS 清单修复 本文深入解析Win10并行配置错误的根源与修复方法,从SxSTrace日志分析到WinSxS清单文件修复。详细介绍了诊断工具的使用、日志解读技巧以及手动修复步骤,帮助用户解决'应用程序并行配置不正确'问题,提升系统稳定性。 阅读详情

XML文件按照元素标记来存储数据,通过遍历这些元素标记可以得到XML文件中所保存的数据。在C++/CX的类库中并未定义用于解析XML文件的类,但C++提供了能解析XML文件的框架和类库,如msxml4、libxml、IXMLDOM和TinyXML等,在使用C++/CX编写应用程序时可以通过C++提供的框架和类库来解析XML文件。TinyXML是一个轻量级解析XML的框架,本节将介绍如何使用此框架来解析一个XML文件。

TinyXML框架包含了以下的类和函数,通过使用这些类和函数可以方便地读取一个XML文件中的数据。

  • TiXmlDocument类,表示整个XML文件的文档类。
  • TiXmlDeclaration类,表示XML文件的声明部分的声明类。
  • TiXmlElement类,表示XML中的节点元素的元素类。
  • RootElement函数,用于得到XML文件中的根节点。
  • FirstChildElement函数,用于得到第一个子节点。
  • FirstAttribute函数,用于得到节点的第一个属性。
  • NextSiblingElement函数,用于得到下一个节点。
  • LoadFile函数,用于加载XML文件。

简单介绍了TinyXML框架之后,接下来通过一个具体的示例来介绍如何使用TinyXML框架解析XML文件。在Visual Staudio 2012中新建一个Visual C++的Windows应用商店的空白应用程序项目,并命名为CookBookDemo。

由于在C++的标准库中并未包含TinyXML框架,因此在使用TinyXML框架来解析XML文件之前,需要将此框架中的几个主要文件添加到项目里,这些文件分别是tinystr.cpp、tinystr.h、tinyxml.cpp、tinyxml.h、tinyxmlerror.cpp和tinyxmlparser.cpp。TinyXML框架的压缩包可以从"http://sourceforge.net/projects/tinyxml/"网站下载,然后按如下的步骤添加上述的主要文件。

右键点击解决方案资源管理器窗口中的项目图标,在弹出的菜单栏中选中"添加",并在"添加"的子菜单栏中选择"现有项",接着在出现的"添加现有项"窗口中选择上述压缩包中的文件,单击"添加"按钮将这些文件添加到项目中。在项目中添加"现有项"如图20-3所示。

图20-3 添加"现有项"

添加了上述TinyXML框架中的主要文件以后,需要在项目中引用相应的头文件,以便能使用TinyXML框架中的类和函数来解析XML文件。打开MainPage.xaml.cpp源文件,使用include关键字引用tinyxml.h头文件,代码如下所示:

#include "tinyxml.h"

引用了tinyxml.h头文件以后,接着为了能在项目中编译tinystr.cpp、tinyxml.cpp 、tinyxmlerror.cpp和tinyxmlparser.cpp源文件,需要分别打开这些源文件,并在文件的开头引用项目中默认的pch.h头文件。代码如下所示:

#include "pch.h"

接下来在项目中添加一个名为"CookBookXMLFile.xml"的XML文件,后面将解析这个XML文件。在解决方案资源管理器窗口中右键点击项目图标,在弹出的菜单栏中选中"添加", 并在"添加"的子菜单栏中选择"新建项",接着在出现的"添加新项"窗口中选择Visual C++菜单栏的"Web"选项,选中"XML文件",添加名为"CookBookXMLFile.xml"的XML文件。在"添加新项"窗口中添加XML文件的步骤如图20-4所示。

图20-4 在"添加新项"窗口中添加XML文件

添加了CookBookXMLFile.xml文件以后,接下来在这个文件中添加数据,后面将说明如何解析此文件来获取这些数据。CookBookXMLFile.xml文件中的代码如下所示:

<?xml version="1.0" encoding="gb2312"?>

<CookBook>

<CookStyle Name="粤菜" Image="冬瓜盅.jpg">

</CookStyle>

<CookStyle Name="川菜" Image="四川麻辣火锅.jpg">

</CookStyle>

<CookStyle Name="闽菜" Image="全丝烩鱼翅.jpg">

</CookStyle>

<CookStyle Name="东北菜" Image="东北汆白肉.jpg">

</CookStyle>

</CookBook>

在CookBookXMLFile.xml文件中,声明编码格式为"gb2312",并定义一个名为"CookBook"的节点,将这个节点作为根节点。在根节点中定义四个名为"CookStyle"的子节点,并在每一个CookStyle节点中定义两个属性Name和Image,分别用于保存菜名和项目中图片的路径。为了能通过Image属性中所保存的图片路径来在前台界面显示图片,需要按照上述添加"现有项"的步骤来添加对应的图片。

在CookBookXMLFile.xml文件中添加了数据以后,接下来定义一个FeedItem类,用来保存CookBookXMLFile.xml文件被解析后得到的数据。打开MainPage.xaml.h头文件,并在此头文件中定义FeedItem类,代码如下所示:

//定义FeedItem

[Windows::UI::Xaml::Data::Bindable]

public ref class FeedItem sealed

{

public:

    //FeedItem构造函数

    FeedItem(void){}

public:

    //保存XMLImage属性的值

    property Platform::String^ Image;

    //保存XMLName属性的值

    property Platform::String^ Name;

};

上面的代码在FeedItem类中定义构造函数FeedItem,接着声明两个属性Name和Image,其中Name属性用来保存CookBookXMLFile.xml文件中CookStyle节点的Name属性值,Image属性用来保存CookStyle节点的Image属性值。

定义了FeedItem类之后,接下来布局前台界面。打开MainPage.xaml文件,并指定Grid元素中的Background属性为"White",接着在此元素中添加如下的代码:

<!-- 菜系列表 -->

<ListView x:Name="CookBookListView" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Auto" ItemsSource="{Binding}" Margin="50,50,0,0">

<ListView.ItemTemplate>

<DataTemplate>

<Grid Margin="10,10,0,0">

<Grid.ColumnDefinitions>

<ColumnDefinition Width="Auto"></ColumnDefinition>

<ColumnDefinition Width="*"></ColumnDefinition>

</Grid.ColumnDefinitions>

<Image x:Name="CookImage" Source="{Binding Path=Image}" Grid.Column="0" Width="50" Height="50"></Image>

<TextBlock x:Name="CookName" Text="{Binding Path=Name}" Grid.Column="1" Foreground="Black"></TextBlock>

</Grid>

</DataTemplate>

</ListView.ItemTemplate>

</ListView>

在上述代码中,添加一个名为"CookBookListView"的ListView控件,使用这个控件以列表的形式显示FeedItem类的对象所保存的数据。接着为ListView控件添加一个DataTemplate模版,并在DataTemplate模版中添加一个Image控件和一个TextBlock控件,其中FeedItem类的Image属性绑定到了Image控件的Source属性上,FeedItem类的Name属性绑定到了TextBlock控件的Text属性上。

布局好前台界面以后,接下来解析CookBookXMLFile.xml文件,并将CookBookXMLFile.xml文件中的数据显示到前台界面中。

由于使用TinyXML框架解析XML文件得到的数据为const char类型,为了将const char类型的数据保存到FeedItem类的对象中,需要对这些数据的类型进行转换。这里使用ChangeToWchar函数来转换数据的类型,在MainPage.xaml.h头文件中声明ChangeToWchar函数,代码如下所示:

private:

    //声明ChangeToWchar函数

    wchar_t* ChangeToWchar(const char* valueChar);

声明了ChangeToWchar函数以后,接着打开MainPage.xaml.cpp源文件,并添加ChangeToWchar函数的实现代码,具体代码如下所示:

wchar_t* CookBookDemo::MainPage::ChangeToWchar(const char* valueChar)

{

    //使用MultiByteToWideChar来转换

    size_t wlen = MultiByteToWideChar(CP_ACP,0, valueChar,strlen(valueChar),NULL,0);

    //定义wchar_t类型指针wStr

    wchar_t *wStr = new wchar_t[wlen+1];

    //使用MultiByteToWideChar函数来转换

    wlen = MultiByteToWideChar(CP_ACP,0, valueChar,strlen(valueChar),wStr,wlen);

    wStr[wlen] = L'\0';

    //返回wStr

    return wStr;

}

在上面的代码中,首先调用MultiByteToWideChar函数得到将参数valueChar转换成wchar_t类型时所需要的内存空间大小,并赋值给一个size_t类型的变量wlen。然后创建一个大小为wlen+1的wchar_t类型的数组,使用一个wchar_t类型的指针wStr指向此数组。接着以wStr指针和wlen变量作为参数调用MultiByteToWideChar函数来将参数valueChar中的值转换成wchar_t类型,并保存到wStr指针所指向的数组中。最后给wStr指针所指向的数组添加结束标志"\0",并返回wStr指针。

添加了ChangeToWchar函数的实现代码以后,接下来在MainPage.xaml.h头文件中添加如下的代码,用于声明解析CookBookXMLFile.xml文件的LoadCookStyle函数。

public:

    //解析XML文件

    void LoadCookStyle();

声明了LoadCookStyle函数以后,接下来在MainPage.xaml.cpp源文件的MainPage构造函数中调用LoadCookStyle函数,以便于在项目启动时解析CookBookXMLFile.xml文件。MainPage构造函数的实现代码如下所示:

MainPage::MainPage()

{

    InitializeComponent();

    //解析XML文件

    LoadCookStyle();

}

接下来在MainPage.xaml.cpp源文件中添加LoadCookStyle函数的实现代码,具体代码如下所示:

//解析XML文件

void CookBookDemo::MainPage::LoadCookStyle()

{

    //创建一个Vector<FeedItem^>类型的集合items

    Platform::Collections::Vector<FeedItem^>^ items=ref new Platform::Collections::Vector<FeedItem^>();

    //加载存放菜谱数据的XML文件

    TiXmlDocument* xmlDocument= new TiXmlDocument("CookBookXMLFile.xml");

    xmlDocument->LoadFile();

    //获得根节点CookBook

    TiXmlElement* cookBookElement = xmlDocument->RootElement();

    //获得CookBook下的第一个子节点

    TiXmlElement* cookStyleNode = cookBookElement->FirstChildElement();

    //CookBook中的CookStyle节点解析出来

    while(cookStyleNode != nullptr)

    {        

        //创建数据源CookBookFeedItem,用于绑定到前台页面

        CookBookDemo::FeedItem^ cookBookFeedItem=ref new CookBookDemo::FeedItem();

        //将得到的CookStyleName属性值转换为wchar_t

        const char* firstAttributeValue=cookStyleNode->FirstAttribute()->Value();

        wchar_t* nameWstr=ChangeToWchar(firstAttributeValue);

        //将得到的CookStyleImage属性值转换为wchar_t

        const char* nextAttributeValue=cookStyleNode->FirstAttribute()->Next()->Value();

        wchar_t* imageWstr=ChangeToWchar(nextAttributeValue);

        //将转换后的值赋给cookBookFeedItem->Name

        cookBookFeedItem->Name=ref new Platform::String(nameWstr);

        //将转换后的值赋给cookBookFeedItem->Image

        cookBookFeedItem->Image=ref new Platform::String(imageWstr);

        //cookBookFeedItem添加到items

        items->Append(cookBookFeedItem);

        //遍历下一个CookStyle节点

        cookStyleNode=cookStyleNode->NextSiblingElement();

    }

    //设置CookBookListView上下文

    CookBookListView->DataContext=items;

}

在LoadCookStyle函数中,首先创建一个Vector<FeedItem^>类型的集合items,接着以CookBookXMLFile.xml文件的路径作为参数调用TiXmlDocument类的构造函数得到一个TiXmlDocument类型的对象,并使用xmlDocument指针指向此对象。然后调用xmlDocument对象的LoadFile函数来加载CookBookXMLFile.xml文件。

接下来调用xmlDocument对象的RootElement函数得到CookBookXMLFile.xml文件的根节点,并使用一个TiXmlElement类型的指针cookBookElement指向这个根节点。接着调用cookBookElement对象的FirstChildElement函数得到根节点中的第一个CookStyle子节点,使用TiXmlElement类型的指针cookStyleNode指向此节点。

当cookStyleNode指针不为空指针时,执行while循环中的代码,创建一个FeedItem类的对象cookBookFeedItem,用来保存数据。接着调用cookStyleNode对象的FirstAttribute函数得到CookStyle节点中的Name属性,通过Value函数得到Name属性的值。同样调用Next函数得到CookStyle节点中的Image属性,通过Value函数得到Image属性的值。然后调用ChangeToWchar函数将Name属性和Image属性的值转换成wchar_t类型,并通过创建String类的对象将这两个属性的值进一步转换成String类型。接着将Name属性和Image属性的值赋值给cookBookFeedItem对象的Name属性和Image属性,并将cookBookFeedItem对象添加到items集合中。最后将items集合赋值给ListView控件的DataContext属性,以便能将cookBookFeedItem对象所保存的数据显示到前台界面中。

运行项目,将显示如图20-5所示的界面。

图20-5 解析XML得到的数据

posted on 2017-03-30 12:35 冯瑞涛 阅读( ...) 评论( ...) 编辑 收藏
VS2010Win10/Win11上的兼容性安装与工业级部署指南 Visual Studio 2010作为一款经典IDE,虽已停止官方支持,但在工业控制、医疗设备、电力自动化等存量系统中仍承担着不可替代的编译与维护任务。其核心价值源于对.NET Framework 4.0、VC++ 2010运行时及Windows SDK 7.0A的深度绑定,构成一套稳定的‘环境契约’。理解该契约的原理——如manifest声明的OS兼容性限制、MSI安装逻辑与系统API交互机制——是突破‘未检测到兼容版本’报错的关键。技术价值体现在离线部署能力、跨代操作系统适配(Win7至Win11)及 阅读详情

相关推荐

Multisim14.0安装教程:Win10环境下系统学习

手把手带你完成Multisim14.0在Windows 10上的完整安装流程,涵盖环境配置、常见报错处理与激活要点。全程聚焦实操细节,避开坑点,确保初学者也能一次成功装好Multisim14.0安装教程核心步骤。

weixin_42594427的博客 485

vc++ xml操作大全

刚接触VC编程的朋友往往对许多数据类型的转换感到迷惑不解,本文将介绍一些常用数据类型的使用。

C++ 使用TinyXML解析XML文件 源码

C++ 使用TinyXML解析XML文件,简单清晰,仅供参考。读取和设置xml配置文件是最常用的操作,TinyXML是一个开源的解析XML的C++解析

C#和C++的速度大比拼(二)

数据库存取测试在这一部分,我们将用C++和C#代码来测试两者对数据库的存取和处理。方法是对同一个数据库表进行操作。表结构如下: CREATE TABLE testtable( col1 INTEGER, col2 VARCHAR(50), PRIMARY KEY (col1)) 测试将分三个部分,第一部分和第三部分集中对数据处理,第二部分集中对数据存取。数据

600000的专栏 2271

VC解析XML

#pragma once #include "./XmlNode.h" #include "./Xsl.h" #include //------------------------------------------------------------------------- // Classes Name     :CXml CXmlNode CXmlNodes // Aut

du_bingbing的博客 1419

在c++中实现对xml文件的读取与写入功能

在c++中成功实现xml文件读取与写入功能

qq_53118460的博客 1594

VC++解析XML的源码 CMarkup XML解析

CMarkup XML解析器概述  转载地址:http://blog.chinaunix.net/uid-18872995-id-302660.html CMarkup概述 7.2版本, 2004年9月27日 Markup72.zip 422k  原文出自http://www.firstobject.com/dn_markup.htm http://www.firstobjec

blacet的专栏 1811

VC++ MSXML创建XML文件以及对XML文档解析

C/C++ code // XmlCreationDemo.cpp #include <stdlib.h> #include <stdio.h> // 引入MSXML解析器 #import <msxml4.dll> using namespace MSXML2; class InitializeCom { public: I...

weixin_30877493的博客 236

VC++ INI文件操作全解析:从API到封装类与MFC实战

Windows桌面应用开发中,配置信息的持久化存储是一个基础且关键的需求。INI文件作为一种轻量级、结构清晰的文本格式,通过简单的[Section]和Key=Value结构,为程序设置提供了直观的存储方案。其核心原理在于Windows系统原生提供的一组Profile API函数,如WritePrivateProfileString和GetPrivateProfileString,使得VC++开发者无需引入第三方库即可实现零依赖的配置读写,这对于需要兼容老旧系统或控制运行时库依赖的项目极具技术价值。在实际工

weixin_30565199的博客 395

VC++解析XML完整文件,包括创建,读取,添加,删除

本例通过MFC建立对话,一步一步实现了VC++XML文件解析,包括XML文件的创建,数据的添加,读取,删除等一系列完整操作,并附注释

VC++6.0闪退终极修复:清单文件与系统兼容性实战指南

在软件开发和遗留系统维护中,应用程序兼容性是一个基础且关键的技术挑战,尤其在Windows操作系统版本迭代过程中。其核心原理涉及操作系统底层机制,如并行程序集(Side-by-Side Assembly)和C运行时库(CRT)的依赖管理。现代Windows系统通过清单文件(.manifest)来声明和管理这些依赖,以确保程序能加载正确版本的动态链接库。对于像VC++6.0这样的经典开发环境,其缺失清单文件是导致在新系统上闪退的根本技术原因。解决此问题的技术价值在于,无需修改原始程序,仅通过外部配置即可恢复其

weixin_30730053的博客 414

vc++中使用xml

By Richard AndersonIntroductionThe Extensible Markup Language (XML) is one of those technologies that you just know you should start supporting in your applications sooner rather than later. Sin

carper的专栏 6311

VC对于XML解析以及操作

XML的查找 #include #include #import #include using namespace std;void Travel(MSXML2::IXMLDOMNodePtr pDOMNode){ if (pDOMNode->GetnodeTypeString()==(_bstr_t)"element") // 获取节点类型 {  printf("%s: ", (ch

Android & Linux 3151

vc++xml

#include "stdafx.h" #include #import named_guids using namespace std; using namespace MSXML; int _tmain(int argc, _TCHAR* argv[]) { ::OleInitialize(NULL); MSXML::IXMLDOMDocumentPtr pDoc; //xml文档

aizeng的专栏 1143

VC++XML文件操作

void COperateXMLDlg::OnBnClickedGen() { //::CoInitialize(NULL); //初始化COM // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); MSXML2::IXMLDOMDocumentPtr pDoc; MSXML2::IXMLDOMElementPtr xmlRoot ;

Jeremy_W的专栏 2946

VC++中利用MSXML解析XML文档

一、 XML 简介   XML(Xtensible Markup Language,即扩展标记语言)的发展起源于1996年。当时,出版界巨头和Web业内人士经过共同讨论,提出了创建SGML(Standard Generalized Markup Language,即标准通用标识语言)子集(HML)的建议。该子集专用于Web,具有可扩展(或可扩充)性,并且能利用结构化标记语言的所有高级功 能,但摒弃

Chinawash 专栏 1457
上一篇: Win10系列:VC++ 定时器
下一篇: Win10系列:VC++文件选取
冯瑞涛TerryFeng
博客等级 码龄18年 14粉丝 680原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值