TinyXML 源码剖析(之一)

写一个XML文件 TinyXML 是一个mini的C++ XML解析库,它是非验证的,它可以很容易的集成到其他的程序中.它解析一份XML doc,以此创建一个可以被读、写,保存的DOM.它主要的类层次架构,函数原形详细说明参看: http://www.grinninglizard.com/tinyxml/index.html // 以下以简单的程序TinyXMLTest为例 TinyXML中最根本的就是Document,所以无论是需要写一个XML文件,还是要读,都必须从一个Document开始,就是(1)的动作,在此没有给构造函数一个参数是因为我们的目的是为了写出一个XML文件,文件的名字就是传给TiXmlDocument的参数。声明,文档,注释,文本,元素,不明类型都是TinyXmlNode的子类,都是一个Node,TinyXmlNode是一个很复杂的东西,它如上所示: #include #include"tinyxml.h" using namespace std; int main(int argc, char** argv) { // (1) create a XML document TiXmlDocument *myDoc = new TiXmlDocument(); Document类型的节点建立好以后,就需要给该DOM树结构一个根,即下面的(2),(3),(5),由于TinyXml是非验证的,所以理论上他是可以有两个Document的,(在内部通过对类型的判断来避免这一情况的发生),由于根是一个元素,而元素本质上就是一个容器,他可以有子元素,文本等,由于属性可以有多个,所以在内部它有一个TinyXmlAttrbuiteSet的成员,用以储存之,而在TinyXmlAttrbuiteSet中所存的Attrbuites是通过带”哨兵”的链表来实现.在每次链接时,都是放置在最后一个位置 //(2) create the Root and connect it TiXmlElement *RootElement = new TiXmlElement("人员组"); myDoc->LinkEndChild(RootElement); //(3 )create a person and connect it TiXmlElement *PersonElement = new TiXmlElement("人员"); RootElement ->LinkEndChild(PersonElement); 如(4)所示,如果一个元素有属性需要设置,通过调用SetAttribute()方法,可以实现目标,在设置时,会在Element的内部的链表上搜索,如果已经有相应的属性名,那么视之为改写,如果没有则添加. //(4) set the attribute fo Person PersonElement ->SetAttribute("ID", "1"); //(5) create Elementy name && age and connect them TiXmlElement* NameElement = new TiXmlElement("姓名"); TiXmlElement* AgeElement = new TiXmlElement("年龄"); PersonElement ->LinkEndChild(NameElement); PersonElement ->LinkEndChild(AgeElement); 如6所示,文本应该是XML中最好处理的tag类型了,它在DOM树结构中只能以“叶子”的形式存在. //(6) set element Name && age and connect it TiXmlText *NameContent = new TiXmlText("周星星"); TiXmlText *AgeContent = new TiXmlText("20"); NameElement ->LinkEndChild(NameContent); AgeElement ->LinkEndChild(AgeContent); 最麻烦的应该就是(7)了,首先以”w”方式打开star.xml文件(如果不存在,则创建),在SaveFile的内部经过一些预处理后,就进入了一个从TinyXmlBase,继承而来的方法Print,在打印的过程中,按深度优先,前序方式进行。 (1) 打印出自己的名字和第一个’<’ eg: (2) 判断是否有属性,有则依次打印,直到结束 eg: (3) 根据是否有子元素确定是打印出”/>” 还是’>’ (4) 若有子元素,递归 (5) 打印完成,关闭文件 (6) SaveFile返回 // (7) save the file myDoc ->SaveFile("star.xml");
tinyxml2 是一个轻量级的 C++ XML 解析库,它提供了一个简单的 API,用于解析、修改和创建 XML 文档。下面是对 tinyxml2 源码的一些分析: 1. 文件结构 tinyxml2 的源码包括以下文件: - tinyxml2.h:包含 tinyxml2 的 API。 - tinyxml2.cpp:包含 tinyxml2 的实现代码。 - xmltest.cpp:包含 tinyxml2 的测试代码。 2. 类结构 tinyxml2 基于 DOM(文档对象模型)模式,它将 XML 文档表示为一棵树。以下是 tinyxml2 的主要类: - XMLDocument:表示整个 XML 文档,包括所有元素、属性和文本。 - XMLElement:表示 XML 文档中的元素,包括其标签名、属性和子元素。 - XMLAttribute:表示 XML 元素的属性。 - XMLText:表示 XML 元素中的文本。 3. 解析流程 tinyxml2 的解析流程是基于事件的,它将 XML 文档分为不同的事件,如元素开始、元素结束、文本等。解析器从头到尾扫描 XML 文档,当它遇到一个事件时,它会调用相应的回调函数。 以下是 tinyxml2 的解析流程: - 创建一个 XMLDocument 对象。 - 调用 XMLDocument::LoadFile() 或 XMLDocument::Parse() 方法,将 XML 文档加载到内存中。 - 解析器开始扫描 XML 文档,并调用相应的回调函数处理每个事件。 - 解析器将事件转换为节点,将节点添加到 XMLDocument 对象中。 - 解析器返回 XMLDocument 对象,表示解析完成。 4. 修改流程 tinyxml2 允许修改 XML 文档,包括添加、删除、修改元素和属性等。以下是 tinyxml2 的修改流程: - 创建一个 XMLDocument 对象。 - 调用 XMLDocument::LoadFile() 或 XMLDocument::Parse() 方法,将 XML 文档加载到内存中。 - 使用 tinyxml2 的 API 修改 XMLDocument 对象。 - 调用 XMLDocument::SaveFile() 方法,将修改后的 XML 文档保存到磁盘。 总之,tinyxml2 是一个非常简单、易于使用的 XML 解析库,它可以轻松处理 XML 文档的解析和修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值