`

TinyXml学习笔记

阅读更多

TinyXml学习笔记

张弛 <zhangchi@china.com>

一、      TinyXml 的特点

TinyXml 是一个基于 DOM 模型的、非验证的轻量级 C++ 解释器。

1.      SAX  DOM

目前 XML 的解析主要有两大模型: SAX  DOM 

其中 SAX 是基于事件的,其基本工作流程是分析 XML 文档,当发现了一个新的元素时,产生一个对应事件,并调用相应的用户处理函数。这种方式占用内存少,速度快,但用户程序相应得会比较复杂。

 DOM (文档对象模型),则是在分析时,一次性的将整个 XML 文档进行分析,并在内存中形成对应的树结构,同时,向用户提供一系列的接口来访问和编辑该树结构。这种方式占用内存大,速度往往慢于 SAX ,但可以给用户提供一个面向对象的访问接口,对用户更为友好。

另据说,一些同时提供了 SAX  DOM 接口的库,是在底层先实现 SAX ,再在 SAX 的基础上实现 DOM 

目前我知道的 XML 解析库有下面几个:

名称

访问接口

是否支持验证

备注

Expat

SAX/Local

不清楚

Local 指它还有一套自己访问模型

LibXML2

SAX/DOM

 

 

 

 

TinyXml

DOM

 

 

 

 

XML4C

SAX/DOM

 Xerces-C 是一家,不过用了 ICU ,国际化似乎更好

Xerces-C

SAX/DOM

 

 

 

 

XML Booster

Local

不清楚

这个库不是特别了解,好像是类似 yacc 那样,可以生成一个特定的解析器,估计效率应该很高(看名字也像)。

2.      验证和非验证

对于一个特定的 XML 文档而言,其正确性分为两个层次。首先是其格式应该符合 XML 的基本格式要求,比如第一行要有声明,标签的嵌套层次必须前后一致等等,符合这些要求的文件,就是一个合格的 XML 文件,称作 well-formatted 。但除此之外,一个 XML 文档因其内容的不同还必须在语义上符合相应的标准,这些标准由相应的 DTD 文件或者 Schema 文件来定义,符合了这些定义要求的XML 文件,称作 valid 

因此,解析器也分为两种,一种是验证的,即会跟据 XML 文件中的声明,用相应的 DTD 文件对 XML 文件进行校验,检查它是否满足 DTD 文件的要求。另一种是忽略 DTD 文件,只要基本格式正确,就可以进行解析。

就我所知,验证的解析器通常都是比较重量级的。 TinyXml 不支持验证,但是体积很小,用在解析格式较为简单的 XML 文件,比如配置文件时,特别的合适。

二、      TinyXml 的构建和使用

1.      获取

TinyXml 首页在 http://www.grinninglizard.com/tinyxml/index.html ,从这里可以找到最新版本的源代码,目前的版本是 2.3.4 

2.      构建

TinyXml 在构建时可以选择是否支持 STL ,选择的话,则可以使用 std::string ,所以通常应该打开这个选项。

 Windows 上, TinyXml 的源码包里提供了 VC6 的工程文件,直接用它就可以生成两个静态库(带 STL 和不带 STL ),非常容易。唯一需要注意的是,默认生成的库是单线程的,如果用在多线程的项目中,需要改动一下配置,生成相应的多线程库。

 Unix 平台上, TinyXml 的源码包里只提供了一个 Makefile ,对于典型的 Linux 系统,或装了 gcc  gmake 的其他 Unix ,这个Makefile 足够用了,我在 RH9  RHEL4 上测试,简单的 make 就成功了。需要注意的有以下几点:默认的编译是不支持 STL 的,可以通过编辑 Makefile  TINYXML_USE_STL := NO 那一行,把 NO 改成 YES 就可以支持 STL 了;还有默认只生成了一个测试程序,没有生成任何库,如果要生成静态库的话,可以用 ar 命令,将生成的几个目标文件打包就行了,如果要生成动态库,则需要加上 -fpic 参数重新编译。

3.      使用

构建了相应的库之后,在使用了它们的工程中,只要在连接时把他们连上就行了。需要注意的是,如果需要 STL 支持,在编译用到了 TinyXml 的文件时,需要定义一个宏 TIXML_USE_STL ,对 gcc ,可以使用参数 -DTIXML_USE_STL ,对 cl.exe  VC ),可以使用参数 /DTIXML_USE_STL ,如果嫌麻烦,可以直接定义在 tinyxml.h 文件里。

三、      TinyXml 的编程模型

1.      类之间的关系

TinyXml 实现的时 DOM 访问模型,因此提供了一系列的类对应 XML 文件中的各个节点。主要类间的关系如下图所示:

 

TiXmlBase :其他类的基类,是个抽象类

TiXmlNode :表示一个节点,包含节点的一般方法,如访问自节点、兄弟节点、编辑自身、编辑子节电

TiXmlDocument :表示整个 XML 文档,不对应其中某个特定的节点。

TiXmlElement :表示元素节点,可以包含子节点和 TiXmlAttribute

TiXmlComment :表示注释

TiXmlDeclaration :表示声明

TiXmlText :表示文本节点

TiXmlUnknown :表示未知节点,通常是出错了

TiXmlAttribute :表示一个元素的属性

下面是一个简单的例子:

<?xml version="1.0" encoding="utf-8" ?>
<!-This is only a sample-->
<book>
       <name>TinyXml How To</name>
       <price unit=”RMB”>20</price>
       <description>Some words…</description>
</ book >
 

整个文档,对应 TiXmlDocument

book,name,price , description ,都对应 TiXmlElement

第一行对应一个 TiXmlDeclaration

第二行对应一个 TiXmlComment

“TinyXml How To” 对应一个 TiXmlText

unit 则是 price 的一个 TiXmlAttribute

这些类与 XML 文件中的相应元素都有很好的对应关系,因此相信参照 TinyXml 的文档,可以很容易的掌握各个方法的使用。

2.      需要注意的问题

各类之间的转换

由于各个节点类都从 TiXmlNode 继承,在使用时常常需要将 TiXmlNode * 类型的指针转换为其派生类的指针,在进行这种转换时,应该首先使用由 TiXmlNode 类提供的一系列转换函数,如 ToElement (void) ,而不是 c++  dynamic_cast

检查返回值

由于 TinyXml 是一个非校验的解析器,因此当解析一个文件时,很可能文件并不包含我们预期的某个节点,在这种情况下,TinyXml 将返回空指针。因此,必须要对返回值进行检查,否则将很容易出现内存访问的错误。

如何重头建立一个 XML 文件

先建立一个 TiXmlDocument 对象,然后,载入某个模板,或者直接插入一个节点作为根节点,接着就可以像打开一个已有的 XML文件那样对它进行操作了。

四、      总结

TinyXml 最大的特点就是它很小,可以很方便的静态连接到程序里。对于像配置文件、简单的数据文件这类文件的解析,它很适合。但是由于它是非验证的,因此需要在程序里做许多检查工做,加重了程序编写的负担。因此对于复杂的 XML 文件,我觉得最好还是用验证的解析器来处理。

 

分享到:
评论

相关推荐

    分布式电源接入配电网的技术挑战与解决方案:风光互补无功补偿及PSO优化

    内容概要:本文探讨了分布式电源(DG)接入配电网所带来的技术挑战及其解决方案。首先介绍了DG接入对配电网潮流分布和电压稳定性的影响,随后详细讨论了风光互补无功补偿技术的应用,旨在稳定电压和提高电能质量。接着,文章阐述了粒子群算法(PSO)在电气互联和故障点位定位中的应用,展示了其在优化电网拓扑结构和快速准确定位故障方面的优势。最后,通过Simulink建模和仿真实验,验证了所提出的方法和技术的有效性。 适合人群:从事电力系统研究、分布式电源集成、智能电网优化的专业人士,以及对相关技术感兴趣的工程技术人员。 使用场景及目标:适用于分布式电源接入配电网的设计与优化,特别是在解决电压波动、无功补偿不足和故障定位不准等问题时。目标是提升配电网的稳定性和效率,确保电力系统的可靠运行。 其他说明:文中提供了多个Matlab和Python代码示例,用于具体实现风光互补无功补偿、粒子群优化算法以及Simulink仿真模型,便于读者理解和实践。

    基于博途V15的1500系列PLC六层电梯SCL编程与梯形图实现

    内容概要:本文详细介绍了使用博途V15软件和1500系列PLC实现单部六层电梯控制系统的SCL编程方法及其梯形图实现。主要内容涵盖电梯的基本控制逻辑,如楼层升降、平层停靠、呼叫响应等。文中通过具体代码示例展示了如何定义关键变量、处理楼层呼叫信号、实现电梯运行和平层停靠逻辑。此外,还讨论了状态机的设计、方向决策算法以及开关门控制等重要环节。文章强调了SCL语言在处理复杂逻辑方面的优势,并对比了梯形图在故障诊断时的直观性。 适合人群:对工业自动化控制感兴趣的技术人员,尤其是熟悉西门子PLC编程的工程师。 使用场景及目标:适用于需要深入了解电梯控制系统编程原理和技术实现的人群。目标是帮助读者掌握SCL语言和梯形图在电梯控制中的应用,提高编程技能。 其他说明:文章提供了完整的代码片段和详细的解释,有助于读者理解和实践。同时提醒读者关注实际应用中的细节问题,如安全保护机制、信号防抖处理等。

    电力电子领域LLC谐振变换器的MATLAB/Simulink仿真及软开关实现

    内容概要:本文详细介绍了如何使用MATLAB/Simulink对全桥和半桥LLC谐振变换器进行仿真,涵盖驱动配置、谐振参数计算、软开关验证以及闭环控制等方面。首先,文章讲解了半桥LLC的基本配置,包括PWM生成、死区时间和谐振参数的设定。接着,讨论了全桥LLC的扩展及其相对于半桥的优势,如更宽的增益范围和更好的输入电压适应性。然后,深入探讨了软开关的验证方法,强调了ZVS(零电压开关)的重要性和实现方式。最后,介绍了闭环控制的设计思路,包括PID控制器的应用和参数调整技巧。 适合人群:从事电力电子设计的研究人员和技术工程师,尤其是那些希望深入了解LLC谐振变换器仿真和优化的人群。 使用场景及目标:适用于需要进行LLC谐振变换器仿真的项目,旨在帮助工程师掌握从基本配置到高级控制的完整流程,确保高效稳定的电源转换系统设计。 其他说明:文中提供了大量MATLAB代码片段,便于读者理解和实践。此外,还给出了许多实用的调试建议和注意事项,有助于避免常见错误并提高仿真成功率。

    居民健康监测系统 2025免费JAVA微信小程序毕设

    2025免费微信小程序毕业设计成品,包括源码+数据库+往届论文资料,附带启动教程和安装包。 启动教程:https://www.bilibili.com/video/BV1BfB2YYEnS 讲解视频:https://www.bilibili.com/video/BV1BVKMeZEYr 技术栈:Uniapp+Vue.js+SpringBoot+MySQL。 开发工具:Idea+VSCode+微信开发者工具。

    宿舍管理系统 2025免费JAVA微信小程序毕设

    2025免费微信小程序毕业设计成品,包括源码+数据库+往届论文资料,附带启动教程和安装包。 启动教程:https://www.bilibili.com/video/BV1BfB2YYEnS 讲解视频:https://www.bilibili.com/video/BV1BVKMeZEYr 技术栈:Uniapp+Vue.js+SpringBoot+MySQL。 开发工具:Idea+VSCode+微信开发者工具。

    电力系统中同步发电机短路与电弧仿真的关键技术及其实现

    内容概要:本文详细介绍了同步发电机短路仿真和电弧仿真的重要性及其具体实现方法。首先讨论了同步发电机短路仿真的核心基础——派克变换,展示了如何利用Python进行派克变换的代码实现,并解释了短路电流的计算方法,包括次暂态电流、暂态电流和稳态电流。接着,文章探讨了电弧仿真的物理特性和数学模型,特别是经典的Mayr电弧模型,并给出了Matlab代码示例。此外,还提到了电弧在不同环境条件下的特性研究,如气压、湿度等因素对电弧的影响。最后,文章强调了这两种仿真在电力系统动态分析中的应用场景,特别是在评估短路故障对发电机及周边设备的影响方面的作用。 适合人群:从事电力系统研究的专业人士、电气工程师、高校师生及相关领域的研究人员。 使用场景及目标:适用于需要深入了解同步发电机短路和电弧仿真原理的研究人员和技术人员,旨在提高电力系统的安全性、可靠性,优化保护措施的设计。 其他说明:文中不仅提供了理论知识,还附带了具体的代码实现,便于读者理解和实践。同时,文章指出了仿真过程中可能出现的问题及解决方案,如数值稳定性问题和接口时序处理等。

    学生选课系统 2025免费JAVA微信小程序毕设

    2025免费微信小程序毕业设计成品,包括源码+数据库+往届论文资料,附带启动教程和安装包。 启动教程:https://www.bilibili.com/video/BV1BfB2YYEnS 讲解视频:https://www.bilibili.com/video/BV1BVKMeZEYr 技术栈:Uniapp+Vue.js+SpringBoot+MySQL。 开发工具:Idea+VSCode+微信开发者工具。

    基于Selenium模拟浏览器行为的小红书关键词搜索和笔记爬取源码+文档说明

    基于Selenium模拟浏览器行为的小红书关键词搜索和笔记爬取源码+文档说明,个人经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做大作业的学生和需要项目实战练习的学习者,可作为毕业设计、课程设计、期末大作业。 基于Selenium模拟浏览器行为的小红书关键词搜索和笔记爬取源码+文档说明基于Selenium模拟浏览器行为的小红书关键词搜索和笔记爬取源码+文档说明基于Selenium模拟浏览器行为的小红书关键词搜索和笔记爬取源码+文档说明基于Selenium模拟浏览器行为的小红书关键词搜索和笔记爬取源码+文档说明基于Selenium模拟浏览器行为的小红书关键词搜索和笔记爬取源码+文档说明基于Selenium模拟浏览器行为的小红书关键词搜索和笔记爬取源码+文档说明基于Selenium模拟浏览器行为的小红书关键词搜索和笔记爬取源码+文档说明基于Selenium模拟浏览器行为的小红书关键词搜索和笔记爬取源码+文档说明基于Selenium模拟浏览器行为的小红书关键词搜索和笔记爬取源码+文档说明基于Selenium模拟浏览器行为的小红书关键词搜索和笔记爬取源码+文档说明基于Selenium模拟浏览器行为的小红书关键词搜索和笔记爬取源码+文档说明基于Selenium模拟浏览器行为的小红书关键词搜索和笔记爬取源码+文档说明基于Selenium模拟浏览器行为的小红书关键词搜索和笔记爬取源码+文档说明基于Selenium模拟浏览器行为的小红书关键词搜索和笔记爬取源码+文档说明基于Selenium模拟浏览器行为的小红书关键词搜索和笔记爬取源码+文档说明基于Selenium模拟浏览器行为的小红书关键词搜索和笔记爬取源码+文档说明基于Selenium模拟浏览器行为的小红书关键词搜索和笔记爬取源码+文档说明基于Selenium模

    医笙小程序系统 2025免费JAVA微信小程序毕设

    2025免费微信小程序毕业设计成品,包括源码+数据库+往届论文资料,附带启动教程和安装包。 启动教程:https://www.bilibili.com/video/BV1BfB2YYEnS 讲解视频:https://www.bilibili.com/video/BV1BVKMeZEYr 技术栈:Uniapp+Vue.js+SpringBoot+MySQL。 开发工具:Idea+VSCode+微信开发者工具。

    工业自动化中高速追剪飞锯系统的维伦通触摸屏与台达PLC程序解析

    内容概要:本文深入探讨了高速追剪飞锯系统的实现细节,特别是维伦通触摸屏和台达PLC之间的协同工作。触摸屏作为人机交互界面,允许操作员设置如切割长度、运行速度等参数,并通过与PLC寄存器的关联实现数据传输。台达PLC则负责执行复杂的电子凸轮追剪算法,确保切割过程的高精度和稳定性。文中还介绍了关键的PLC指令,如MC_GearIn和CAM_GEN,以及它们在速度同步和位置控制中的应用。此外,文章揭示了一些调试技巧和潜在问题,如数据类型对齐、补偿算法和参数调整方法。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是那些对PLC编程和人机界面设计感兴趣的人。 使用场景及目标:适用于需要理解和优化高速追剪飞锯系统的场合,旨在提高生产效率和产品质量。通过学习本文,读者可以掌握如何设置和调试此类系统,从而减少故障率并提升性能。 其他说明:文章不仅提供了理论知识,还包括了许多实用的操作建议和经验分享,有助于读者更好地应对实际工作中遇到的技术挑战。

    高速永磁同步电机Maxwell仿真:50000-100000rpm转速区间的电磁与机械设计挑战

    内容概要:本文详细探讨了高速永磁同步电机(HSPMSM)在50000-100000rpm转速范围内的设计与仿真挑战。首先介绍了高速电机的应用背景及其面临的离心力和电磁损耗等问题。接着,通过具体实例展示了如何利用Maxwell软件进行电机的几何建模、材料设置、边界条件与激励设置,并进行了详细的模拟结果分析。文中特别强调了在极端转速条件下,如10万转时,电机内部的物理现象以及相应的优化措施,如采用碳纤维护套增强机械强度、调整损耗计算模型以提高精度等。 适合人群:从事电机设计与仿真的工程师和技术研究人员,尤其是对高速永磁同步电机感兴趣的从业者。 使用场景及目标:适用于希望深入了解高速永磁同步电机设计原理及仿真技巧的人群,旨在帮助他们掌握Maxwell软件的具体应用方法,解决实际工程中遇到的技术难题,如高转速下的电磁兼容性和机械可靠性问题。 其他说明:文章不仅提供了理论指导,还包括大量实用的操作步骤和代码示例,有助于读者快速上手并应用于实际工作中。此外,文中提到的一些特殊处理方式(如碳纤维护套的应用),为解决特定工况下的技术瓶颈提供了新思路。

    浪潮英信服务器 SA5212M5 用户手册

    浪潮英信服务器 SA5212M5 用户手册

    COMSOL仿真中放电电极击穿空气的电场分布与击穿电压计算

    内容概要:本文详细介绍了如何使用COMSOL进行放电电极击穿空气的仿真。首先构建了一个针尖电极和球头圆柱电极组成的模型,设置了静电和电流耦合的物理场,并进行了网格优化。通过参数化扫描和MATLAB脚本,计算不同间隙距离下的击穿电压,并利用Paschen曲线进行验证。同时探讨了电场强度在尖端的集中现象及其对击穿的影响,提出了改进网格质量和求解器设置的方法。最后,通过电场矢量图和电势分布图展示了仿真的结果。 适合人群:从事电磁场仿真、电气工程、等离子体物理等相关领域的研究人员和技术人员。 使用场景及目标:适用于需要精确计算电极间击穿电压和电场分布的研究项目,帮助设计高压设备和评估电极结构的安全性和可靠性。 其他说明:文中提供了详细的建模步骤和代码片段,便于读者复现实验结果。同时强调了网格质量、边界条件和求解器设置对仿真准确性的重要影响。

    家居项目后端资源采用ssm架构

    家居项目后端资源采用ssm架构

    互联网大厂面试题合集:并发编程面试题-重点.pdf

    整理一线大厂面试题合集

    牵牛花铅笔素材儿童教学课件模板.pptx

    牵牛花铅笔素材儿童教学课件模板

    我的日记 2025/4/19

    2024年的记录。

    互联网大厂面试题合集:Linux操作系统面试题.pdf

    整理一线大厂面试题合集

    Apollo 7.0行为预测模块升级:轨迹交互与评估器设计详解及其应用

    内容概要:本文详细解析了Apollo 7.0行为预测模块的关键升级点,主要包括新增的Inter-TNT模式、VECTORNET_EVALUATOR以及JOINTLY_PREDICTION_PLANNING_EVALUATOR。这些组件通过引入轨迹交互模拟、动态归一化、联合预测规划等创新机制,显著提高了障碍物轨迹预测的准确性和场景适应性。特别是在处理复杂交通场景如高速公路变道、十字路口交汇时表现出色。此外,文中还介绍了增量式特征更新机制的应用,有效减少了CPU占用,提升了系统的实时性能。 适用人群:适用于对自动驾驶技术感兴趣的开发者、研究人员和技术爱好者,尤其是那些希望深入了解Apollo平台行为预测模块工作原理的人群。 使用场景及目标:①帮助读者理解Apollo 7.0行为预测模块的技术细节;②指导开发者如何利用这些新技术提升自动驾驶系统的预测精度;③为研究者提供有价值的参考资料,促进相关领域的进一步探索。 其他说明:文章不仅提供了详细的代码解读,还包括了实际应用场景中的效果对比,使读者能够全面掌握新旧版本之间的差异。同时,附带的思维导图有助于快速理清各个子模块之间的调用关系和数据流向。

    用OpenGL开发的机械臂运动仿真程序,并且实现机械手臂向四个方向的旋转.rar

    OpenGL是一种强大的图形库,用于创建2D和3D图形,广泛应用于游戏开发、科学可视化、工程设计等领域。在这个项目中,我们看到一个基于OpenGL的机械臂运动仿真程序,它能够实现机械臂在四个方向上的旋转。这样的模拟对于理解机械臂的工作原理、机器人控制算法以及进行虚拟环境中的机械臂运动测试具有重要意义。 我们需要了解OpenGL的基础知识。OpenGL是一个跨语言、跨平台的编程接口,用于渲染2D和3D矢量图形。它提供了大量的函数来处理图形的绘制,包括几何形状的定义、颜色设置、光照处理、纹理映射等。开发者通过OpenGL库调用这些函数,构建出复杂的图形场景。 在这个机械臂仿真程序中,C#被用来作为编程语言。C#通常与Windows平台上的.NET Framework配合使用,提供了一种面向对象的、类型安全的语言,支持现代编程特性如LINQ、异步编程等。结合OpenGL,C#可以构建高性能的图形应用。 机械臂的运动仿真涉及到几个关键的计算和控制概念: 1. **关节角度**:机械臂的每个部分(或关节)都有一个或多个自由度,表示为关节角度。这些角度决定了机械臂各部分的位置和方向。 2. **正向运动学**:根据关节角度计算机械臂末端执行器(如抓手)在空间中的位置和方向。这涉及将各个关节的角度转换为欧拉角或四元数,然后转化为笛卡尔坐标系的X、Y、Z位置和旋转。 3. **反向运动学**:给定末端执行器的目标位置和方向,计算出各关节所需的理想角度。这是一个逆向问题,通常需要解决非线性方程组。 4. **运动规划**:确定从当前状态到目标状态的路径,确保机械臂在运动过程中避免碰撞和其他约束。 5. **OpenGL的使用**:在OpenGL中,我们首先创建几何模型来表示机械臂的各个部分。然后,使用矩阵变换(如旋转、平移和缩放)来更新关节角度对模型的影响。这些变换组合起来,形成机械臂的动态运动。 6. **四向旋转**:机械臂可能有四个独立的旋转轴,允许它在X、Y、Z三个轴上旋转,以及额外的绕自身轴线的旋转。每个轴的旋转都由对应的关节角度控制。 7. **交互控制**:用户可能可以通过输入设备(如鼠标或键盘)调整关节角度,实时观察机械臂的运动。这需要将用户输入转换为关节角度,并应用到运动学模型中。 8. **图形渲染**:OpenGL提供了多种渲染技术,如深度测试、光照模型、纹理映射等,可以用于提高机械臂模拟的真实感。例如,可以添加材质和纹理来模拟金属表面,或者使用光照来增强立体感。 这个项目结合了OpenGL的图形渲染能力与C#的编程灵活性,构建了一个可以直观展示机械臂运动的仿真环境。通过理解并实现这些关键概念,开发者不仅能够学习到图形编程技巧,还能深入理解机器人学的基本原理。

Global site tag (gtag.js) - Google Analytics