- 浏览: 2008576 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (651)
- ACE (35)
- BAT (9)
- C/C++ (116)
- fast-cgi (14)
- COM (27)
- python (59)
- CGI (4)
- C# (2)
- VC (84)
- DataBase (29)
- Linux (96)
- P2P (6)
- PHP (15)
- Web (6)
- Memcached (7)
- IME输入法 (11)
- 设计模式 (2)
- 搜索引擎 (1)
- 个人情感 (4)
- 笔试/面试 (3)
- 一亩三分地 (33)
- 历史 (2)
- 地理 (1)
- 人物 (3)
- 经济 (0)
- 不仅仅是笑哦 (43)
- 小故事大道理 (2)
- http://www.bjdsmyysjk120.com/ (0)
- http://www.bjdsmyy120.com/ (0)
- 它山之石可以攻玉 (15)
- 大学生你关注些什么 (28)
- 数据恢复 (1)
最新评论
-
luokaichuang:
这个规范里还是没有让我明白当浏览器上传文件时,STDIN的消息 ...
FastCGI规范 -
effort_fan:
好文章!学习了,谢谢分享!
com技术简介 -
vcell:
有错误os.walk(strPath)返回的已经是全部的文件和 ...
通过python获取目录的大小 -
feifeigd:
feifeigd 写道注意:文章中的CPP示例第二行 #inc ...
ATL入门:利用ATL编写简单的COM组件 -
feifeigd:
注意:文章中的CPP示例第二行 #include " ...
ATL入门:利用ATL编写简单的COM组件
TinyXml介绍
TinyXml是一个基于DOM模型的、非验证的轻量级C++解释器
一. XML解析模型:
目前XML的解析主要有两大模型:SAX和DOM。
SAX是基于事件的,其基本工作流程是分析XML文档,当发现了一个新的元素时,产生一个对应事件,并调用相应的用户处理函数。这种方式占用内存少,速度快,但用户程序相应得会比较复杂。
DOM(文档对象模型),则是在分析时,一次性的将整个XML文档进行分析,并在内存中形成对应的树结构,同时,向用户提供一系列的接口来访问和编辑该树结构。这种方式占用内存大,速度往往慢于SAX,但可以给用户提供一个面向对象的访问接口,对用户更为友好。
另据说,一些同时提供了SAX和DOM接口的库,是在底层先实现SAX,再在SAX的基础上实现DOM
对于一个特定的XML文档而言,其正确性分为两个层次。
首先是其格式应该符合XML的基本格式要求,比如第一行要有声明,标签的嵌套层次必须前后一致等等,符合这些要求的文件,就是一个合格的XML文件,称作well-formatted。
其次,一个XML文档因其内容的不同还必须在语义上符合相应的标准,这些标准由相应的DTD文件或者Schema文件来定义,符合了这些定义要求的XML文件,称作valid。
因此,解析器也分为两种,一种是验证的,即会跟据XML文件中的声明,用相应的DTD文件对XML文件进行校验,检查它是否满足DTD文件的要求。另一种是忽略DTD文件,只要基本格式正确,就可以进行解析。
就我所知,验证的解析器通常都是比较重量级的。TinyXml不支持验证,但是体积很小,用在解析格式较为简单的XML文件,比如配置文件时,特别的合适。
二. TinyXml 介绍:
Tiny Xml Online Documentation
TinyXml Class Hierarchy
This inheritance list is sorted roughly, but not completely, alphabetically:
TiXmlBase
TiXmlAttribute
TiXmlNode
TiXmlComment
TiXmlDeclaration
TiXmlDocument
TiXmlElement
TiXmlText
TiXmlUnknown
TiXmlHandle
TiXmlVisitor
TiXmlPrinter
TinyXml实现的时DOM访问模型,因此提供了一系列的类对应XML文件中的各个节点。主要类间的关系如下图所示:
TiXmlBase:其他类的基类,是个抽象类
TiXmlNode:表示一个节点,包含节点的一般方法,如访问自节点、兄弟节点、编辑自身、编辑子节电
TiXmlDocument:表示整个XML文档,不对应其中某个特定的节点。
TiXmlElement:表示元素节点,可以包含子节点和TiXmlAttribute
TiXmlComment:表示注释
TiXmlDeclaration:表示声明
TiXmlText:表示文本节点
TiXmlUnknown:表示未知节点,通常是出错了
TiXmlAttribute:表示一个元素的属性
各类之间的转换
由于各个节点类都从TiXmlNode继承,在使用时常常需要将TiXmlNode*类型的指针转换为其派生类的指针,在进行这种转换时,应该首先使用由 TiXmlNode类提供的一系列转换函数,如ToElement(void),而不是c++的dynamic_cast
检查返回值
由于TinyXml是一个非校验的解析器,因此当解析一个文件时,很可能文件并不包含我们预期的某个节点,在这种情况下,TinyXml将返回空指针。因此,必须要对返回值进行检查,否则将很容易出现内存访问的错误。
如何重头建立一个XML文件
先建立一个TiXmlDocument对象,然后,载入某个模板,或者直接插入一个节点作为根节点,接着就可以像打开一个已有的XML文件那样对它进行操作了。
三. TinyXml 实践:Linux: Makefile setting
# DEBUG can be set to YES to include debugging info, or NO otherwise
DEBUG := YES
# PROFILE can be set to YES to include profiling info, or NO otherwise
PROFILE := NO
# TINYXML_USE_STL can be used to turn on STL support. NO, then STL
# will not be used. YES will include the STL files.
TINYXML_USE_STL := YES
TinyXml在构建时可以选择是否支持STL,选择的话,则可以使用std::string,所以通常应该打开这个选项。
在Windows上,TinyXml的源码包里提供了VC6的工程文件,直接用它就可以生成两个静态库(带STL和不带STL),非常容易。唯一需要注意的是,默认生成的库是单线程的,如果用在多线程的项目中,需要改动一下配置,生成相应的多线程库。
构建了相应的库之后,在使用了它们的工程中,只要在连接时把他们连上就行了。需要注意的是,如果需要STL支持,在编译用到了TinyXml的文件时,需 要定义一个宏TIXML_USE_STL,对gcc,可以使用参数-DTIXML_USE_STL,对cl.exe(VC),可以使用参数 /DTIXML_USE_STL,如果嫌麻烦,可以直接定义在 tinyxml.h文件里。
附件: pro
四. 例程:
引自: http://www.cnblogs.com/phinecos/archive/2008/03/11/1100912.html
#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); }
发表评论
-
Berkeley DB 使用经验总结
2012-08-27 14:41 3038作者:陈磊 NoSQL是现在互联网Web2.0时代备受 ... -
嵌入式数据库系统Berkeley DB
2012-08-27 14:37 1489前言 UNIX/LINUX平台下的数据库种类非常多 ... -
C语言中标准输入流、标准输出流、标准错误输出流
2011-06-13 14:32 9220C语言中标准输入流、标准输出流、标准错误输出流 在 ... -
Rsync 实现原理
2011-05-12 20:06 8268Rsync 实现原理 前言 关于rsync的原始文档 ... -
c++简单的虚函数测试
2011-04-27 14:25 977#include <iostream> u ... -
C++文件行查找
2011-04-26 14:10 1364#include <iostream> # ... -
c++偏特化简单示例
2011-04-13 11:17 2122c++偏特化 // temp1.c ... -
GDB调试精粹及使用实例
2011-03-16 14:06 1100GDB调试精粹及使用实例 一:列文件清单 1. ... -
简单的ini文件解析
2011-02-12 16:36 1582int GetKeyVal(const string s ... -
scanf族函数高级用法
2011-01-25 16:00 2502如何解释 fscanf(fd,&quo ... -
使用scons替代makefile(1)
2011-01-25 11:58 3655早在多年前我刚开始接触linux下的C程序时,经常被makef ... -
使用scons替代makefile(2)
2011-01-25 11:57 3542本篇文章接着上一篇进一步介绍scons的使用方法,主要介绍静态 ... -
使用scons替代makefile(3)
2011-01-25 11:55 4785在上两篇文章中已经简单介绍了用scons编译库文件,可执行程序 ... -
C 支持动态添加测试数据的测试代码
2011-01-13 17:22 1089/下面的定义为了支持可扩增。 //当需要增加一个新的测试用列 ... -
Linux下Makefile的automake生成
2010-12-28 16:55 1062******************helloworld.c* ... -
SCons笔记(详细版)
2010-12-23 16:11 104021. 基本使用 SConstruct文件就功能而言相当于Ma ... -
scons 学习
2010-12-23 11:14 2130scons 学习 作者:Sam(甄峰) sam_code@h ... -
scons随笔
2010-12-22 20:20 4652scons随笔 Scons是新一代的软件构件工具,或者说ma ... -
Scons在linux下的安装和使用
2010-12-21 11:59 3215因为正在用的一个开源软件需要的Developm ... -
排列组合的实现
2010-12-20 12:41 1023简单算法: 从前往后(或者从后往前)每次交换一个位置。当存在 ...
相关推荐
TinyXml介绍 TinyXml是一个基于DOM模型的、非验证的轻量级C++解释器 一. XML解析模型: 目前XML的解析主要有两大模型:SAX和DOM。 SAX是基于事件的,其基本工作流程是分析XML文档,当发现了一个新的元素时,...
TinyXML介绍 在TinyXML中,根据XML的各种元素来定义了一些类: TiXmlBase:整个TinyXML模型的基类。 TiXmlAttribute:对应于XML中的元素的属性。 TiXmlNode:对应于DOM结构中的节点。 TiXmlComment:对应于XML中的...
TinyXML是一个简单小巧,可以很容易集成到其它程序中的C++ XML解析器。 它能做些什么 简单地说,TinyXML解析一个XML文档并由此生成一个可读可修改可保存的文档对象模型(DOM)。 XML的意思是“可扩展标记语言...
本文是对TinyXml工具的一些知识点的理解。
软件介绍: TinyXml解析xml文件,本资源已经将TinyXml源码打包成Dll动态库,可直接调用,非常方便。TinyXml.dllTinyXml.libvcruntime140_app.dll
通过使用tinyxml、cmarkup分别介绍xml文件解析方法,附件也有完整代码可以解析所有不同情况下的节点值,附件也有完整的注释和动态解析代码。
TinyXML介绍 最近做一个负载均衡的小项目,需要解析xml配置文件,用到了TinyXML,感觉使用起来很容易,给出一个使用TinyXML进行XML解析的简单例子,很多复杂的应用都可以基于本例子的方法来完成。 TinyXML是一个开源...
资源包含2015.9.23从官网下载的tinyxml2的源码和自己编写的示例代码还有介绍文档,容易上手。官网的示例代码和文档晦涩难懂,才自己整理。
详细介绍xml解析器Tinyxml的使用方法,对静态表,动态表的解析有详细的例子,对于学习这款小巧便捷的解析器有非常大的帮助
tinyxml介绍,tinyxml操作实例,tinyxml介绍,tinyxml操作实例
XML学习指南,极适合新手学习,其中样式表、处理指令和CDATA、DTD子集、级联样式表、XSL模版等XML基本知识都有详细介绍及教学,本书将有助你开发ASP.NET XML网络程序时遇到的XML方方面面的问题
详细介绍了FatFs和SD卡开发的相关知识,包含了很多测试成功的代码,工程是基于STM32的。
VC解析XML文件的工具有很多,CMarkup, tinyXML,还有IBM的,MS的等等。 所以就用CMarkup来解析,使用过后,觉得非常不错,使用起来很方便。 本文件是对VC解析XML文件-CMarkup的官方使用说明打包下载了,方便放到...
本篇文章主要介绍了C++读入XML文件,读取和设置xml配置文件是最常用的操作,TinyXML是一个开源的解析XML的C++解析库,感兴趣的小伙伴们可以参考一下。
主要介绍了centos 7 mysql-8.0.19-1.el7.x86_64.rpm-bundle.tar的相关知识,需要的朋友可以参考下
在实现列车模拟运行时,使用了TinyXml来解析列车时刻表数据,并使用VC++来设计列车控件。在模拟运行过程中,列车控件将根据列车时刻表数据来模拟列车的运行状态,包括列车的运行线路、列车的停靠站台、列车的到达...
VisDrone 数据集和 FLIR 数据集介绍和训练 VisDrone 数据集是当前最大的无人机目标检测数据集之一,由 263 个视频片段和 10209 幅静态图像组成,涵盖不同位置、环境、对象以及密度等方面。该数据集能够对视觉分析...
Snap.svg 介绍,包括单页应用程序概念、相关库和 Angular 功能示例。 用于描述二维矢量图形的 XML 标记语言。 SVG 之于图形,正如 XHTML 之于文本。 1999 - W3C 图形对象: 文本 无 功能集: 嵌套转换 剪切...
该平台包括网关核心板 Tiny6410、7 寸显示屏、COMS 摄像头、有线及无线(SDIO)网络接口、串口、USB、按键等。 2.2. 软件平台 该项目的软件平台主要包括三个部分:传感数据采集及外围控制设备、Zigbee 模块数据...