xml解析方法:C++解析XML 的方法



用mingw32-make前修改下makefile文件,改为如下

#DEBUGcanbetoYEStodebugginginfo,orNOotherwise(不是DEBUG)
DEBUG:=NO
#PROFILEcanbetoYEStoprofilinginfo,orNOotherwise
PROFILE:=NO
#TINYXML_USE_STLcanbeusedtoturnonSTLsupport.NO,thenSTL
#willnotbeused.YESwilltheSTLfiles.(使用STL,选择则可以使用std::)
TINYXML_USE_STL:=YES
、TinyXml特点
TinyXml是个基于DOM模型、非验证轻量级C解释器
1.SAX和DOM
目前XML解析主要有两大模型:SAX和DOM
其中SAX是基于事件其基本工作流程是分析XML文档当发现了个新元素时产生个对应事件相应用户处理这种方式占用内存少速度快但用户相应得会比较复杂
而DOM(文档对象模型)则是在分析时次性将整个XML文档进行分析并在内存中形成对应树结构同时向用户提供系列接口来访问和编辑该树结构这种方式占用内存大速度往往慢于SAX但可以给用户提供个面向对象访问接口对用户更为友好

2.验证和非验证
对于个特定XML文档而言其正确性分为两个层次首先是其格式应该符合XML基本格式要求比如第行要有声明标签嵌套层次必须前后致等等符合这些要求文件就是个合格XML文件称作well-formatted但除此的外个XML文档因其内容区别还必须在语义上符合相应标准这些标准由相应DTD文件或者Schema文件来定义符合了这些定义要求XML文件称作valid
因此解析器也分为两种种是验证即会跟据XML文件中声明用相应DTD文件对XML文件进行校验检查它是否满足DTD文件要求种是忽略DTD文件只要基本格式正确就可以进行解析
就我所知验证解析器通常都是比较重量级TinyXml不支持验证但是体积很小用在解析格式较为简单XML文件比如配置文件时特别合适

2、TinyXml构建和使用
1.获取
TinyXml首页在http://www.grinninglizard.com/tinyxml/index.html从这里可以找到最新版本源代码目前版本是2.4.3(截至2006.5.17).
2.构建
TinyXml在构建时可以选择是否支持STL选择则可以使用std::所以通常应在Windows上TinyXml源码包里提供了VC6工程文件直接用它就可以生成两个静该打开这个选项态库(带STL和不带STL)非常容易需要注意默认生成库是单线程如果用在多线程项目中需要改动下配置生成相应多线程库 [Page]
在Unix平台上TinyXml源码包里只提供了个Makefile对于典型Linux系统或装了gcc和gmake其他Unix这个Makefile足够用了我在RH9和RHEL4上测试简单make就成功了需要注意有以下几点:默认编译是不支持STL可以通过编辑MakefileTINYXML_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文件里

3、TinyXml编程模型

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


TiXmlBase:其它类基类是个抽象类
TiXmlNode:表示个节点包含节点般思路方法如访问自节点、兄弟节点、编辑自身、编辑子节点
TiXmlDocument:表示整个XML文档不对应其中某个特定节点
TiXmlElement:表示元素节点可以包含子节点和TiXmlAttribute
TiXmlComment:表示注释
TiXmlDeclaration:表示声明
TiXmlText:表示文本节点
TiXmlUnknown:表示未知节点通常是出错了
TiXmlAttribute:表示个元素属性
下面是个简单例子:
<?xmlversion=\"1.0\"encoding=\"utf-8\"?>


<!-Thisisonlyasample-->


<book>


<name>TinyXmlHowTo</name>


<priceunit=”RMB”>20</price>


<description>Somewords…</description>


</book>


整个文档对应TiXmlDocument
book,name,price,description都对应TiXmlElement
行对应个TiXmlDeclaration
第 2行对应个TiXmlComment
“TinyXmlHowTo”对应个TiXmlText


unit则是price个TiXmlAttribute
这些类和XML文件中相应元素都有很好对应关系因此相信参照TinyXml文档可以很容易掌握各个思路方法使用

2.需要注意问题
各类的间转换


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

检查返回值


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

如何重头建立个XML文件


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

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

延伸阅读

最新评论

发表评论