TinyXML的使用

来源:互联网 发布:地图数据质量 编辑:程序博客网 时间:2024/05/22 00:07

在我们准备导出xml的过程中,因为最终的目标是导出ogre的xml格式,所以需要用到相关的XML库。我们可以手工用stream进行文本输出,但是使用TinyXML有很多的好处,特别是在逻辑结构上。我们使用的版本是2.5.3的。


会用到的几个案例:


创建xml对象,这个作为一个新建立的文档的句柄。建立后所有的文档节点(element)都会存在该文档中。

TiXmlDocument *pXmlDoc = new TiXmlDocument();


在文档中写入文件头

TiXmlDeclaration declarationElem (_T("1.0"), _T(""), _T("")); //xml文件头pXmlDoc->LinkEndChild(&declarationElem);

上面的句法,会在文档保存的时候写入<?xml version="1.0" ?>


在文档中写入一个元素,

TiXmlElement meshElem ("mesh");pXmlDoc->LinkEndChild(&meshElem);
上面的句法,会在文档保存的时候写入<mesh> ... </mesh>,省略号是可能具备的具体的其他内容。


给元素赋予相关的属性,

TiXmlElement submesh("submesh");submeshes.LinkEndChild(&submesh);submesh.SetAttribute("material", "");submesh.SetAttribute("usesharedvertices", "");

上面的句法,会在文档保存的时候写入<submesh material="" usesharedvertices="">


上述几种句法,能够完成大多数我们需要做的事情。看得出来,使用TinyXML的好处是,写代码的过程中注重的是文档的结构,而不是相关的各个XML句法的细节。


要注意的是,实际操作中,每个element不能用上面的案例中的放置在堆栈上的写法,必须用new来在堆中生成。否则,如下的提示会产生:



这个问题的根本原因是:TinyXml中,在析构的时候,会用delete来删除链表上的每个node。代码片段,

TiXmlNode::~TiXmlNode(){TiXmlNode* node = firstChild;TiXmlNode* temp = 0;while ( node ){temp = node;node = node->next;delete temp;}}
这个片段也说明了另外一个第一次使用TinyXML需要关心的问题,new出来的节点,谁来负责delete。答案是,除了根节点我们需要调用delete,其他的都是库来管理的。