现在的位置: 首页 > 综合 > 正文

TinyXML的使用

2013年10月12日 ⁄ 综合 ⁄ 共 1102字 ⁄ 字号 评论关闭

在我们准备导出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,其他的都是库来管理的。

抱歉!评论已关闭.