TinyXML初学
来源:互联网 发布:里皮的水平知乎 编辑:程序博客网 时间:2024/06/05 04:23
由于需要解析xml,不免要接触一下,对比了各个xml解析库,虽然TinyXML的速度和效率不是最高,但是理解和使用较为简单,所以今天就把学习到的内容做一个总结,基本上都是收集自网络,谢谢各位前辈的总结。
1.XML是什么
XML 代表Extensible Markup Language(eXtensible Markup Language的缩写,意为可扩展的标记语言)。XML是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识。它也是元标记语言,即定义了用于定义其他与特定领域有关的、语义的、结构化的标记语言的句法语言。
2.DOM是什么
DOM是文档对象模型的简称。一个XML文件是由若干XML元素组成的,用一个树形结构可以表示各个XML元素之间的顺序关系以及嵌套包含关系。在树形结构的基础上,结合面向对象的思想,可以将“树”进一步抽象成N个不同的对象,就形成了文档对象模型。
3.TinyXML是什么
1).TinyXML是目前非常流行的一款基于DOM模型的XML解析器,简单易用且小巧玲珑,非常适合存储简单数据,配置文件,对象序列化等数据量不是很大的操作。
2).TinyXML是一个开源的XML的解析类库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而方便地访问和操作XML结构树。
简言之,TinyXML是一个简单的,轻量级的,由C++实现的XML文档的解析器,它可以被其它程序方便地集成进去使用。总结四个特点,XML、DOM、开源、跨平台。
4.TinyXML获取地址
TinyXML的首页 http://www.grinninglizard.com/tinyxml,可以从这里可以获得最新版本的源代码。
TinyXML在SourceForge的项目主页 http://sourceforge.net/projects/tinyxml/
5.TinyXML的类结构
<?xml version="1.0" standalone=no><!–Comment-><RootElement> <Element Attribute="1">Text</Element></RootElement>
TinyXML的各个类与上面文档中的各个XML元素的对应关系是:
TiXmlBase:由关系图可以看出,它是所有类的基类;
TiXmlElement和TiXmlAttribute:对应于XML元素以及元素属性;例如 <Element Attribute="1"></Element>
TiXmlNode:表示一个节点;例如 <RootElement>
TiXmlComment:对应于XML注释,即文档的第二行;例如 <!–Comment->
TiXmlDeclaration:对应于XML文档声明,即文档的第一行;例如 <?xml version="1.0" standalone=no>
TiXmlDocument:对应于整个XML文档;
TiXmlText:对应于XML文档中的文字部分;例如 Text
TiXmlUnknown:表示未知节点,通常是出错了;
TiXmlVisitor:遍历器接口,描述了每个节点的处理方法,由子类实现;
TiXmlPrinter:Printer遍历器;
6.一个小例子
先将TinyXML解压,拷贝其中tinystr.h,tinyxml.h,tinystr.cpp,tinyxml.cpp,tinyxmlerror.cpp,tinyxmlparser.cpp六个文件加入工程。在工程目录下写一个如下xml一样的待解析文件。
<?xml version="1.0" encoding="utf-8"?><filecomp status="err"><f><name>server.ini</name><size>493</size><crc>0AEFCC64</crc></f><f><name>server.ini</name><size>491</size><crc>50AF176B</crc></f></filecomp>
#include "tinyxml.h"#include <stdio.h>int main(){const char* filepath = "BC.xml"; TiXmlDocument doc(filepath); bool rs = doc.LoadFile(); if (!rs){exit(1);}TiXmlElement* root = doc.RootElement();for(TiXmlNode* item = root->FirstChild("f"); item; item = item->NextSibling("f")) {TiXmlNode* child = item->FirstChild();const char* name = child->ToElement()->GetText();if (name) {printf("name:%s\n", name);} else {printf("\n");}child = item->IterateChildren(child);const char* size = child->ToElement()->GetText();if (size) {printf("size:%s\n", size);} else {printf("\n");}child = item->IterateChildren(child);const char* crc = child->ToElement()->GetText();if (crc) {printf("crc:%s\n", crc);} else {printf("\n");}printf("\n");}}
根据代码应该比较好理解其中的含义,解析结果如下。
7.TingXML剖析(转自http://www.wuzesheng.com/?p=260)
<?xml version="1.0" standalone=no><!--Our to do list data--><ToDo><Item priority="1"> Go to the <bold>Toy stone!</bold></Item><Item priority="2"> Do bills</Item></ToDo>
1).TinyXML把xml文档建立成一棵DOM(Document Object Model)树,具体实现用的是firstchild-nextsibling tree。
上图中蓝色的指向first child,红色的指向last child, 绿色的指向next sibling, 紫色的指向previoud sibling, 黑色的指向parent。
2).结合TinyXML的类结构,得出对应关系如下。
3).再看一棵DOM树。
<bookstore> <book category="cooking"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book></bookstore>
4).总结DOM树的特点。
a.在节点树中,顶端的节点成为根节点;
b.根节点之外的每个节点都有一个父节点;
c.节点可以有任何数量的子节点;
d.叶子是没有子节点的节点;
e.同级节点是拥有相同父节点的节点;
到这里对于TinyXML的也有一个初步的了解,至于如何解析xml,还需要不断实践,查询官方说明文档了,http://www.grinninglizard.com/tinyxmldocs/index.html
PS:1.由于TinyXml是一个非校验的解析器,因此当解析一个文件时,很可能文件并不包含预期的某个节点,在这种情况下,TinyXml将返回空指针。因此,必须要对返回值进行检查,否则将很容易出现内存访问的错误。
2.默认生成的TinyXML库是单线程的,如果用在多线程的项目中,需要改动一下配置,生成相应的多线程库。
- TinyXML初学
- tinyXML
- tinyxml
- TinyXml
- tinyxml
- TinyXML
- tinyxml
- tinyxml
- TinyXML
- TinyXML
- tinyxml
- TinyXml
- TinyXML
- tinyxml
- tinyXml
- TinyXML
- TinyXML
- TinyXML
- Codeforces Round #136 (Div. 2) D. Little Elephant and Array
- the functional interface to the i2c busses.
- 单用户模式启动 修改root密码
- VS 2005 Warning 小记
- 用js使得输入框input只能输入数字
- TinyXML初学
- jQuery选择器中含有空格的注意事项
- 二叉树的遍历
- VC调试入门
- 正则表达式
- Linux编程常用的函数
- 伸长的守候
- frameset框架中session失效后怎样重定向到登录页面
- c++ reference counting引用计数原理