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
是
XMLBooster
Local
不清楚
这个库不是特别了解好像是类似yacc那样可以生成个特定解析器估计效率应该很高(看名字也像)
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.3.4
2.构建
TinyXml在构建时可以选择是否支持STL选择话则可以使用std::所以通常应该打开这个选项
在Windows上TinyXml源码包里提供了VC6工程文件直接用它就可以生成两个静态库(带STL和不带STL)非常容易唯需要注意是默认生成库是单线程如果用在多线程项目中需要改动下配置生成相应多线程库
在Unix平台上TinyXml源码包里只提供了个Makefile对于典型Linux系统或装了gcc和gmake其他Unix这个Makefile足够用了我在RH9和RHEL4上测试简单make就成功了需要注意有以下几点:默认编译是不支持STL可以通过编辑MakefileTINYXML_USE_STL:=NO那行把NO改成YES就可以支持STL了;还有默认只生成了个测试没有生成任何库如果要生成静态库话可以用ar命令将生成几个目标文件打包就行了如果要生成动态库则需要加上-fpic参数重新编译 [Page]
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
检查返回值
由于TinyXml是个非校验解析器因此当解析个文件时很可能文件并不包含我们预期某个节点在这种情况下TinyXml将返回空指针因此必须要对返回值进行检查否则将很容易出现内存访问
如何重头建立个XML文件
先建立个TiXmlDocument对象然后载入某个模板或者直接插入个节点作为根节点接着就可以像打开个已有XML文件那样对它进行操作了
最新评论