C++中XML的解析与生成之TinyXML

声明:欢迎任何人和组织转载本blog中文章,但必须标记文章原始链接和作者信息。

本文链接:http://blog.csdn.net/li_007/archive/2009/03/30/4037213.aspx

开拓进取的小乌龟------->CSDN点滴点点滴滴Blog

XML文件的解析:

前段时间需要用C++写一个读写解析XML的控制台程序,想想自己写,是不可能的,为了这么点事情,所以就去找Opensourece的东东了,google一下发现了很多的使用Parser XML的库,最后具体了解了下TinyXML和Xerces这俩个有名的Lib了,Xerces是IBM贡献的一个重量级的库,而TinyXML则是一个很小的XML解析的库,正适合我的需要,也就选择了TinyXML,但是需要说明的是TinyXML是没有验证功能的,这样需要自己多很多的验证来保证XML的正确性,增加Programer工作量,但是对付一些Configuration File之类的使用来说足以,并且是简单容易上手的,他总共也就那么点代码,大概6000行代码,很方便地以静态库的形式为我们服务。

在TinyXML中大概有以下的一些类,它的Inheritance Diagram如下:

C++中XML的解析与生成之TinyXML_第1张图片

很简单吧,也就那么几个类,各个类的作用如下图:

C++中XML的解析与生成之TinyXML_第2张图片

 

在这里啰嗦下,TinyXML是基于DOM的,所以是将所有的数据都存放在内存中,这样方便读写,也不方便像TiXmlPrinter这样功能的实现,而不是想SAX那样产生数据就发送一个Event来实现操作。

XML文件的生成:

前面简单介绍了TinyXML,顺便写了一个简单的例子来测试利用TinyXML生成xml文件,其实代码实现很简单。如下:

view plain print ?
  1. void WrittingXML(TiXmlString & xmlFile)  
  2. {  
  3.     TiXmlDeclaration * xmlDec = new TiXmlDeclaration("1.0""UTF-8""yes");  
  4.     TiXmlDocument * xmlDocs = new TiXmlDocument();  
  5.     xmlDocs->LinkEndChild(xmlDec);  
  6.     TiXmlElement * element = new TiXmlElement("Document");  
  7.     xmlDocs->LinkEndChild(element);  
  8.     TiXmlComment * comment = new TiXmlComment(" This is a list of new books ");  
  9.     element->LinkEndChild(comment);  
  10.     TiXmlElement * book = new TiXmlElement("Book");  
  11.     book->SetAttribute("Name""How to use TinyXML");  
  12.     element->LinkEndChild(book);  
  13.     TiXmlElement * author = new TiXmlElement("Author");  
  14.     TiXmlText * Authortext = new TiXmlText("Leezhm");  
  15.     author->LinkEndChild(Authortext);  
  16.     book->LinkEndChild(author);  
  17.     TiXmlElement * date = new TiXmlElement("Date");  
  18.     TiXmlText * Datetext = new TiXmlText("2009-3-30");  
  19.     date->LinkEndChild(Datetext);  
  20.     book->LinkEndChild(date);  
  21.     xmlDocs->SaveFile(xmlFile.c_str());  
  22.     delete xmlDocs;  
  23. }  

运行后利用IE 8.0打开截图如下:

C++中XML的解析与生成之TinyXML_第3张图片

好了,看后就知道很简单的,这也是我选择它的一个原因,但这里做很简单的测试,没有对xml进行验证代码实现,但是TinyXML自己带的test Application中有对xml进行验证的函数,大家有兴趣可以去看。

代码很简单不啰嗦,说点别的,仔细看看代码,其中使用了很多new来建立了对象指针,但是只看到一个delete,也许你会说着会引起内存泄漏,其实在上面的函数中,后面的delete也可以不要,并且还不会造成内存泄漏。原因看看TinyXML实现的源码中TiXmlNode的析构函数的实现代码如下:当然顺便注意下所有的类的虚拟构造函数。

view plain print ?
  1. TiXmlNode::~TiXmlNode()  
  2. {  
  3.     TiXmlNode* node = firstChild;  
  4.     TiXmlNode* temp = 0;  
  5.     while ( node )  
  6.     {  
  7.         temp = node;  
  8.         node = node->next;  
  9.         delete temp;  
  10.     }     
  11. }  

在结合一下前面文章介绍TinyXML的继承图表就清楚了为什么这儿不需要我们手动释放堆栈了,特别是不需要一个一个地释放,只需要最后释放最高节点就可以,比如TiXmlDocument节点。。。。。。在我实现的函数中其实也可以不需要delete xmlDocs这句的,因为他们都是局部变量,当变量的作用域结束的时候,会自动释放。当然使用delete会触发相应的class的析构函数的调用,这些都是C++的实现机制,在次不多说。

BTW:正是由于上面的原理,我们添加到TinyXML中的节点。。。都必须是动态用new来创建的。如果创建的不是指针,在内存释放的时候会出现错误的,这个可以自己去测试。我想TinyXML这样实现是因为TInyXML实现机制的要求,因为它是基于DOM,所有的节点都是在内存中。


你可能感兴趣的:(C++中XML的解析与生成之TinyXML)