TinyXML:一个优秀的C++ XML解析器

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。

TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。

DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。 如下是一个XML片段: <Persons> <Person ID="1"> <name>周星星</name> <age>20</age> </Person> <Person ID="2"> <name>白晶晶</name> <age>18</age> </Person> </Persons>

在TinyXML中,根据XML的各种元素来定义了一些类:

TiXmlBase:整个TinyXML模型的基类。

TiXmlAttribute:对应于XML中的元素的属性。

TiXmlNode:对应于DOM结构中的节点。

TiXmlComment:对应于XML中的注释

TiXmlDeclaration:对应于XML中的申明部分,即<?versiong="1.0" ?>。

TiXmlDocument:对应于XML的整个文档。

TiXmlElement:对应于XML的元素。

TiXmlText:对应于XML的文字部分

TiXmlUnknown:对应于XML的未知部分。

TiXmlHandler:定义了针对XML的一些操作。

TinyXML是个解析库,主要由DOM模型类(TiXmlBase、TiXmlNode、TiXmlAttribute、TiXmlComment、TiXmlDeclaration、TiXmlElement、TiXmlText、TiXmlUnknown)和操作类(TiXmlHandler)构成。它由两个头文件(.h文件)和四个CPP文件(.cpp文件)构成,用的时候,只要将(tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp)导入工程就可以用它的东西了。如果需要,可以将它做成自己的DLL来调用。举个例子就可以说明一切。。。 对应的XML文件: <Persons> <Person ID="1"> <name>phinecos</name> <age>22</age> </Person> </Persons>

读写XML文件的程序代码: #include <iostream> #include "tinyxml.h" #include "tinystr.h" #include <string> #include <windows.h> #include <atlstr.h> using namespace std;

CString GetAppPath() {//获取应用程序根目录 TCHAR modulePath[MAX_PATH]; GetModuleFileName(NULL, modulePath, MAX_PATH); CString strModulePath(modulePath); strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\'))); return strModulePath; }

bool CreateXmlFile(string& szFileName) {//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false try { //创建一个XML的文档对象。 TiXmlDocument *myDocument = new TiXmlDocument(); //创建一个根元素并连接。 TiXmlElement *RootElement = new TiXmlElement("Persons"); myDocument->LinkEndChild(RootElement); //创建一个Person元素并连接。 TiXmlElement *PersonElement = new TiXmlElement("Person"); RootElement->LinkEndChild(PersonElement); //设置Person元素的属性。 PersonElement->SetAttribute("ID", "1"); //创建name元素、age元素并连接。 TiXmlElement *NameElement = new TiXmlElement("name"); TiXmlElement *AgeElement = new TiXmlElement("age"); PersonElement->LinkEndChild(NameElement); PersonElement->LinkEndChild(AgeElement); //设置name元素和age元素的内容并连接。 TiXmlText *NameContent = new TiXmlText("周星星"); TiXmlText *AgeContent = new TiXmlText("22"); NameElement->LinkEndChild(NameContent); AgeElement->LinkEndChild(AgeContent); CString appPath = GetAppPath(); string seperator = "\"; string fullPath = appPath.GetBuffer(0) +seperator+szFileName; myDocument->SaveFile(fullPath.c_str());//保存到文件 } catch (string& e) { return false; } return true; }

bool ReadXmlFile(string& szFileName) {//读取Xml文件,并遍历 try { CString appPath = GetAppPath(); string seperator = "\"; string fullPath = appPath.GetBuffer(0) +seperator+szFileName; //创建一个XML的文档对象。 TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str()); myDocument->LoadFile(); //获得根元素,即Persons。 TiXmlElement *RootElement = myDocument->RootElement(); //输出根元素名称,即输出Persons。 cout << RootElement->Value() << endl; //获得第一个Person节点。 TiXmlElement *FirstPerson = RootElement->FirstChildElement(); //获得第一个Person的name节点和age节点和ID属性。 TiXmlElement *NameElement = FirstPerson->FirstChildElement(); TiXmlElement *AgeElement = NameElement->NextSiblingElement(); TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute(); //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。 cout << NameElement->FirstChild()->Value() << endl; cout << AgeElement->FirstChild()->Value() << endl; cout << IDAttribute->Value()<< endl; } catch (string& e) { return false; } return true; } int main() { string fileName = "info.xml"; CreateXmlFile(fileName); ReadXmlFile(fileName); }

转载于:https://my.oschina.net/zmlblog/blog/167778

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462025.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《C++标准程序库》学习笔记5 — 第七章

1.(P252) 迭代器的分类及其能力&#xff1a;input迭代器只能读取元素一次。如果复制input迭代器&#xff0c;并使原迭代器和新产生副本都向前读取&#xff0c;可能会遍历到不同的值。output迭代器类似。 2.(P258) C不允许修改任何基本类型&#xff08;包括指针&#xff09;的暂…

Android无线调试——抛开USB数据线

开发Android的朋友都知道&#xff0c;真机调试需要把手机与PC相连&#xff0c;然后把应用部署到真机上进行安装和调试。长长的USB线显得很麻烦&#xff0c;而且如果需要USB接口与其他设备连接的话显得很不方便。今天介绍一种不通过USB线就可以进行真机调试的方法。首先让手机与…

C中不能直接比较两个double类型

在比较float 和double类型的时候&#xff0c;因为float/double精度的问题&#xff0c;比如1.000000001可能和1.0000000000001相等&#xff0c;不应该直接使用a>b等类似的方式进行比较&#xff0c;而是采用 两个数做差取绝对值然后跟指定的精度进行比较 &#xff0c;便可得出…

C#基础——C#入门

教材是C#入门经典&#xff08;第四版&#xff09;。 PC:Thinkpad sl410 OS:Win7 Ultimate SDE:VS 2010 Ultimate 1.2 什么是C#&#xff1f; C#是从C、C语言演化而来&#xff0c;Microsoft专门为使用.Net平台而创建的语言&#xff0c;读作C sharp。运行在.Net CRL环境上的应用程…

VS2017动态链接库(.dll)的生成与使用

这里以VS2017为例子&#xff0c;讲解一下动态链接库&#xff08;.dll&#xff09;的生成与使用。 一、动态链接库&#xff08;.dll&#xff09;的生成 1、打开&#xff1a;“文件”-“新建”-“项目” 2、打开&#xff1a;“已安装”-“模板”-“Visual C”-“Win32”-“Win3…

让Windows7 x64 IIS7支持32位应用程序

我的os是Win7 64位&#xff0c;因为开发的一个应用程序使用了非dot net 的32 位的dll。 经常出现无法装载****.dll的问题。 下面的命令让IIS 7支持32位的应用程序&#xff1a; cscript %SystemDrive%\inetpub\AdminScripts\adsutil.vbs set w3svc/AppPools/Enable32bitAppOnWin…

c#中用声音提示报警(转)

using System; using System.Runtime.InteropServices; 调用 Interaction.Beep(); 使用MessageBeep(unit uType):需添加 using System.Runtime.InteropServices; public const int MB_ICONEXCLAMATION 48; [DllImport("user32.dll")] public static extern bool M…

android3.2以上切屏禁止onCreate()

一般切屏禁止onCreate&#xff08;&#xff09;方法需要将activity加上属性&#xff1a; android:configChanges”orientation|keyboardHidden” 但是在3.2以上就不起作用了&#xff0c;需要加上screenSize&#xff08;也只有3.2以上才有这个选项&#xff09;: android:configC…

typedef用法总结

1、用途一&#xff1a;定义一种类型的别名&#xff0c;可以用作同时声明指针型的多个对象。 比如对于char* pa, pb&#xff0c;初学者往往错误地认为定义了两个字符型指针&#xff0c;但是它只声明了一个指向字符变量的指针和一个字符变量&#xff1b; 而 typedef char* PCH…

Linux下gcc编译生成动态链接库*.so文件并调用它

动态库*.so在linux下用c和c编程时经常会碰到&#xff0c;最近在网站找了几篇文章介绍动态库的编译和链接&#xff0c;总算搞懂了这个之前一直不太了解得东东&#xff0c;这里做个笔记&#xff0c;也为其它正为动态库链接库而苦恼的兄弟们提供一点帮助。1、动态库的编译下面通过…

Mysql安装后在服务里找不到和服务启动不起来的解决方法

一&#xff0c;在安装完Mysql数据库后&#xff0c;发现在控制面板->管理->服务中找不到Mysql的服务启动 解决方法如下&#xff1a;开启命令行&#xff0c;按照如下步骤即可&#xff1b; 1.进入到mysql的安装包&#xff0c;在bin里执行&#xff1a;mysqld.exe -install …

WINFORM如何只弹出一个子窗体

public partial class Form1:Form{ Form2 fnull; public Form1() { InitializeComponent(); } private void Form1_Click(object sender, EventArg e) { if(fnull||f.IsDisposed) //注意先判断null&#xff0c;再判断IsDisposed&#xff0c;…

“指向指针的指针”的应用场景

结合以下博文来看。 值传递与地址传递的区别_天糊土的博客-CSDN博客 二维数组数和指针操作的理解_天糊土的博客-CSDN博客 “指针1”的理解_天糊土的博客-CSDN博客 多重指针操作_天糊土的博客-CSDN博客_多重指针 二重指针的应用场景 &#xff08;1&#xff09;用指针的指针指向指…

su root 和su - root 的区别

前几天&#xff0c;在一次项目中&#xff0c;犯了一个很低级的错误&#xff0c;但是没弄明白是什么问题。情况是这样的&#xff0c;我们在做灾备&#xff0c;重启系统化&#xff0c;以root用户权限&#xff0c;通过 su oracle &#xff0c;进去后&#xff0c;oracle的rac 无法正…

弹出框

<!DOCTYPE html> <html xmlns"http://www.w3.org/1999/xhtml"> <head> <meta http-equiv"Content-Type" content"text/html; charsetgb2312" /> <title>AlertBox 弹出层&#xff08;信息提示框&#xff09;效果&l…

一些Base64编码/解码及数据压缩/解压方面的知识

一.Base64编码/解码 一般用到的是Delphi自带的单元EncdDecd,当然还有第三方提供的单元或控件,其中我所接触到的认为比较好的有Indy的TIdMimeEncode / TIdMimeDecode组件,以及RjMime单元. 在这里主要想讲讲如何才能获得最好的编码/解码性能,EncdDecd提供了EncodeStream/DecodeSt…

easyUI 绑定右键菜单在数据行上显示

easyUI的显示数据的div都有一个样式,如下图 所有的表格都有一个datagrid-cell的样式那么这个时候我们就可以利用jquery来做时间的绑定了 下面是主要的js代码: /*绑定右键*/$(".datagrid-cell").live(contextmenu,function(e){//显示快捷菜单$(#mm).menu(show, {left:…

值传递与地址传递的区别

以下内容源于网络资源的学习与整理&#xff0c;欢迎交流。 总结 值传递&#xff0c;只是把原参的复制品传给形参&#xff0c;在子函数中修改这个形参&#xff0c;不会改变主函数中的原参。 地址传递&#xff0c;由于形参和原参表示同一个内容&#xff0c;在子函数中修改形参&a…

交叉编译器arm-linux-gcc

(一)交叉编译器简介 在一种计算机环境中运行的编译程序&#xff0c;能编译出在另外一种环境下运行的代码&#xff0c;这个编译过程就叫交叉编译.简单地说&#xff0c;就是在一个平台上生成另一个平台上的可执行代码. (二)体系结构与操作系统 (1)常见的体系结构有ARM结构、x86结…

web前端细解cookie那些事

web前端细解cookie那些事&#xff0c;在互联网时代&#xff0c;IT行业飞速发展&#xff0c;带动了web前端开发行业的兴趣。由于行业新兴起时间不久&#xff0c;专业人才缺乏&#xff0c;薪资待遇较高&#xff0c;已成为众多IT学子选择就业的首选&#xff0c;今天就为分享一些有…