Phinecos(洞庭散人) 专注于开源技术的研究与应用 TinyXML:一个优秀的C++ XML解析器

读取和设置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);
}

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

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

相关文章

windows聚焦壁纸不更新_Win10无法自动更换聚焦锁屏壁纸怎么办?

Win10无法自动更换聚焦锁屏壁纸怎么办&#xff1f;在Win10系统的默认情况下&#xff0c;锁屏界面设置的是Windows聚焦&#xff0c;如果我们使用微软账户登录&#xff0c;系统会自动更换锁屏壁纸&#xff0c;让我们每天都能看到不一样的锁屏壁纸。然而有用户发现&#xff0c;系统…

jdbc-------JDBCUtil类 工具类

jdbcutil 主要处理的是 连接数据库&#xff0c; 和关闭各个流 1&#xff0c; 数据库连接的配置信息&#xff1a; mysql.properties (在工程的目录下)个人配置 urljdbc:mysql://localhost:3306/test drivercom.mysql.jdbc.Driver usernameroot password123 2&#xff0c; 获取连…

1.关于python

开始时间&#xff1a;2018年12月6日19:13:24 python第一次接触&#xff0c;将学习《简明python3教程》这本书&#xff0c;顺便做下笔记。 ----------------------------------------------------------------------------------------------------- 1、python的特点&#xf…

mybatis 使用in 查询时报错_MyBatis(四):mybatis中使用in查询时的注意事项

packagecom.boco.jobmonitor.model;importjava.util.Date;importjavax.persistence.GeneratedValue;importjavax.persistence.GenerationType;importjavax.persistence.Id;public classJobitem {/*** 唯一键 pk* 列名:id 类型:INTEGER(10) 允许空:false 缺省值:null*/IdGenerat…

python网络聊天器多线程版

在之前的一篇文章&#xff08;python网络编程-udp&#xff09;中实现了一个简单的udp聊天器&#xff0c;只能在单线程下进行收发数据&#xff0c;在学习完多线程之后&#xff0c;实现一个能同时收发数据的udp聊天器。 说明&#xff1a; 编写一个有2个线程的程序线程1用来接收数…

CentOS 7 / RHEL 7 systemd 指令

CentOS 7 已经切换到 systemd&#xff0c;系统指令也有所变化。之前用于启动、重启、停止各种服务的service 作为向后兼容的指令还能使用&#xff0c;但是将来可能会消失。同时&#xff0c;chkconfig 也改成了systemctl 了。这里列举了一些常用的对应于 service 和 chkconfig 的…

隔离域逻辑

在一个设计模式类中&#xff0c;我对建模域逻辑进行了有趣的讨论。 具体来说&#xff0c;它与隔离域逻辑有关 。 应用程序通常分为三个部分&#xff1a; 演示&#xff08;例如桌面GUI&#xff0c;浏览器&#xff0c;Web服务&#xff09; 域逻辑 基础架构&#xff08;例如持久…

2.基础

时间&#xff1a;2018年12月7日18:45:59 ----------------------------------------------------------------------------------- 1.字面常量&#xff1a;指数字或文本字符串&#xff0c;值不能被改变 &#xff08;1&#xff09;数字&#xff1a;整数&#xff0c;浮点数&…

vsco怎么两个滤镜叠加_PS插件 VSCO滤镜137款预设安装使用教程

文末获取资源VSCO是大名鼎鼎的手机滤镜&#xff0c;以其逼真的胶片文艺复古风爆红&#xff0c;vsco滤镜甚至被誉为照片调色界的业界良心(没有之一)。不过vsco滤镜虽然很好用但苦于一直没有电脑版本&#xff0c;许多摄影爱好者还会用手机调色后放进PS精修。VSCO面板可以在PS上完…

Tensorflow笔记(一)

1.交叉熵 在tensorflow中用:tf.nn.sigmoid_cross_entropy_with_logits()来表示跟sigmoid搭配使用的交叉熵。tf.nn.softmax_cross_entropy_with_logits()来表示跟softmax搭配使用的交叉熵。转载于:https://www.cnblogs.com/fzth-gfh/p/10123182.html

甘特图 知乎_如何使用 Excel 绘制甘特图?

————看了上面几张甘特图&#xff0c;基本上只实现了『计划』和『百分比进度』这两个概念&#xff0c;只有在理想化的一切按照计划发展的情况下才有参考价值。但是实际上执行会提前、也可能延期&#xff0c;进度实时都可能变更&#xff0c;我们应该分开考虑计划图和进度图的…

Kali 2.0 采用ssh连接登陆

Kali GNU/Linux 2.0 \n \l 安装完kali2.0 采用ssh远程连接尽然会出现“无法连接”的情况&#xff0c;下面就此情况来解决问题 第一步&#xff1a;编辑ssh配置文件 rootrslinux:~# vim /etc/ssh/sshd_config 第二步&#xff1a;重新启动ssh服务 rootrslinux:~# /etc/init.d/ssh …

3.运算符与表达式,控制流

时间&#xff1a;2018年12月8日14:56:25 -------------------------------------------------------------------------------------------- 表达式包括运算符与操作数 1、运算符 2、求值顺序 控制流&#xff08;3种&#xff09; 1、if语句 number 23 guess int(input…

英语口语练习系列-C37-服饰-询问年龄-沁园春-长沙

服饰 clothes or jewelryyour favorite clothes or jewelryjewelrynecklacebraceletearringsgolddiamondbeadbroochbanglecrystalfashionfashionablesuittrendstylishboutiqueuniquepersonalityinterestuniformoccupationindividualitycasual wearcomfortable clothestradition…

因此,甲骨文杀死了java.net

好吧&#xff0c;还没有……但是他们宣布要在2017年5月之前关闭java.net和 kenai。JohnK . Waters 在ADTmag的Kenai和java.net的“日落”一文中接受了我的采访。 由于Oracle几乎没有提供有关已经托管在java.net上的关键项目会发生什么情况的信息&#xff0c;因此本文中编写的大…

snmp的使用

freebsd7.1安装snmp cd /usr/ports/net-mgmt/net-snmp make make install net-snmp相关资料 http://www.net-snmp.cn/ Snmp分2种角色&#xff1a;SNMP管理站&#xff08;manager&#xff0c;我们的本机127.0.0.1&#xff09;和SNMP代理&#xff08;agent&#xff0c;我们…

1个ieee1394端口_请问IEEE1394端口有什么作用?

匿名用户1级2007-07-31 回答IEEE1394标准是一种非专用的、高速的串行总线输入输出标准。它提供了一种连接数字设备的方法&#xff0c;包括个人计算机和用户电子硬件。它独立于平台&#xff0c;可以升级(可扩展)&#xff0c;并在支持对等连接方面很灵活。IEEE1394标准无需将数字…

jsoup 获取html中body内容_Java 进阶 利用Jsoup获取HTML页面的各分页中的标题信息...

简单介绍一下JsoupJsoup是一款Java 的HTML解析器&#xff0c;可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API&#xff0c;可通过DOM&#xff0c;CSS以及类似于Xpath,jQuery的操作方法来取出和操作元素和数据。使用Jsoup&#xff0c;需要导入Jsoup所需Jar包&a…

在Windows下如何安装Tomcat服务器搭建

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP 程序的首选服务器。 在Windows下安装Tomcat服务器的方式有两种&#xff0c;一种是直接安…

剑指offer-3(替换空格)

题目&#xff1a; 实现一个方法&#xff0c;把一个字符数组里面的空格全部替换为“20%”。 思路&#xff1a; 首先呢&#xff0c;要先获取字符数组中有多少个空格以及字符数组中字符的长度&#xff0c;计算出替换后的长度&#xff1b;然后&#xff0c;让一个虚拟指针indexOfNew…