TinyXml库简单解析xml文件

tinyxml是采用c++语言编写的解析xml文档解析器,这玩意比较简单,小巧,感觉和Java的dom4j很像。这里写个简单的列子的来说该如何使用它来解析xml文件。

首先下载tinyxml,下载地址是:http://sourceforge.net/projects/tinyxml/。解压后,docs是其文档,需要的时候可以仔细看看,这里主要需要这6个文件:

tinystr.cpp

tinystr.h

tinyxml.cpp

tinyxml.h

tinyxmlerror.cpp

tinyxmlparser.cpp

最简单的办法是将这6个文件添加到我们创建的工程中去即可。当然你还可以使用lib和dll,用vs打开里面的tinyxml.sln,编译相应的lib和dll就行,这里就不具体说了,直接用最简单的办法。


xml文件比较常见的几种类型大概是这样的:

一:不嵌套子子元素,也不含有文本,只有元素和其中的属性和属性值。像这样:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root>
	<data key="1" value="abc" /> 
	<data key="2" value="xxcv" />	
</Root>

二:不嵌套子子元素,含有文本。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root>
	<data key="1" value="abc" > 
		<test1> hello</test1>
		<test2>world</test2>
	</data>
</Root>


三:嵌套子子元素,这里的例子嵌套一层。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root>
	<data key="1" value="abc" > 
		<test1>hello</test1>
		<test2>world</test2>
	</data>
	<data key="2" value="xxcv" />	
</Root>

这里,我分别写2个例子,来解析钱两种种情况的xml文件。

第一种xml的解析:

#include "tinyxml.h"
#include "tinystr.h"
#include <iostream>
#include <string>


void parse_xml()
{
	std::string xml_name = "test1.xml";

	TiXmlDocument *xml_doc = new TiXmlDocument(xml_name.c_str());
	if (NULL == xml_doc)
	{
		return;
	}

	xml_doc->LoadFile();

	//xml_doc->Print();				//可以打印出xml

	//获取xml中的根元素
	TiXmlElement *root_element = xml_doc->RootElement();
	if (NULL == root_element)
	{
		return;
	}

	// 获取根元素的名称
	std::cout << "root元素名称:" << root_element->Value() << std::endl; 

	// 依次遍历根元素下的子元素
	for (TiXmlElement *element = root_element->FirstChildElement(); element != NULL; element = element->NextSiblingElement())
	{
		std::cout << "子元素名称: "<< element->Value() << std::endl;

		// 可以使用Attribute()函数来获取某个元素的某个属性值
		const char *char_id = element->Attribute("key");
		std::string value = element->Attribute("value");

		//获取某个元素的属性值也可以使用下面注释中的方法
		//ps:由于QueryStringAttribute()这个函数使用不了,若属性值是bool,float,double,int等数值型的都可以使用QueryIntAttribute,QueryDoubleAttribute这些函数
		//int id = 0;
		//std::string char_value;
		//element->QueryIntAttribute("key",&id);
		//element->QueryStringAttribute("value",&char_value);		//api文档中是有这个函数的,但是用不了

		std::cout << "id: " << atoi(char_id) << ",value: " << value << std::endl;
	}

	delete xml_doc;
}

int main()
{
	parse_xml();

	system("pause");
	return 0;
}

第二种情况的xml解析:

#include "tinyxml.h"
#include "tinystr.h"
#include <iostream>
#include <string>


void parse_xml()
{
	std::string xml_name = "test1.xml";

	TiXmlDocument *xml_doc = new TiXmlDocument(xml_name.c_str());
	if (NULL == xml_doc)
	{
		return;
	}

	xml_doc->LoadFile();

	//xml_doc->Print();				//可以打印出xml

	//获取xml中的根元素
	TiXmlElement *root_element = xml_doc->RootElement();
	if (NULL == root_element)
	{
		return;
	}

	// 获取根元素的名称
	std::cout << "root元素名称:" << root_element->Value() << std::endl; 

	// 依次遍历根元素下的子元素
	for (TiXmlElement *element = root_element->FirstChildElement(); element != NULL; element = element->NextSiblingElement())
	{
		std::cout << "子元素名称: "<< element->Value() << std::endl;
		// 依次遍历子元素下的子子元素
		for (TiXmlElement *child_element = element->FirstChildElement(); child_element != NULL; child_element = child_element->NextSiblingElement())
		{
			std::cout << "子子元素名称: "<< child_element->Value() << std::endl;
			std::cout << "子子元素文本内容" << child_element->GetText() << std::endl;
		}

		// 可以使用Attribute()函数来获取某个元素的某个属性值
		const char *char_id = element->Attribute("key");
		std::string value = element->Attribute("value");

		//获取某个元素的属性值也可以使用下面注释中的方法
		//ps:由于QueryStringAttribute()这个函数使用不了,若属性值是bool,float,double,int等数值型的都可以使用QueryIntAttribute,QueryDoubleAttribute这些函数
		//int id = 0;
		//std::string char_value;
		//element->QueryIntAttribute("key",value: " << value << std::endl;
	}

	delete xml_doc;
}

int main()
{
	parse_xml();

	system("pause");
	return 0;
}


第三种情况的xml解析就不写了,其实前两种就基本上全部包含了解析的方法。

主要是加载xml文档,这里也可以这样写:

TiXmlDocument *xml_doc = new TiXmlDocument(xml_name.c_str());
	if (NULL == xml_doc)
	{
		return;
	}

	xml_doc->LoadFile();
可以写成这样,上下两者是一样的:
	TiXmlDocument *xml_doc = new TiXmlDocument();
	if (NULL == xml_doc)
	{
		return;
	}

	xml_doc->LoadFile(xml_name.c_str());

然后获取根元素,然后循环遍历根元素下得子元素,可过Attribute函数来获取某个元素的某个属性值,也可以通过QueryIntAttribute和QueryDoubleAttribute等函数来获取,通过Value()来取到某个元素的名称,通过GetText()来得到某个元素中的文本内容等等。


这玩意的好处就是简单,小巧,很容易学习。其实在我遇到的游戏开发过程中,全部用的是第一种xml,这样很方便策划填表,更方便程序来解析。

还有就是这个xml解析库是开源的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类
XML入门的常见问题(二)
Java对象的强、软、弱和虚引用
JS解析XML文件和XML字符串详解
java中枚举的详细使用介绍
了解Xml格式
XML入门的常见问题(四)
深入SQLite多线程的使用总结详解
PlayFramework完整实现一个APP(一)
XML和YAML的使用方法
XML轻松学习总节篇