加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

TinyXml库简单解析xml文件

发布时间:2020-12-16 09:21:13 所属栏目:百科 来源:网络整理
导读:tinyxml是采用c++语言编写的解析xml文档解析器,这玩意比较简单,小巧,感觉和Java的dom4j很像。这里写个简单的列子的来说该如何使用它来解析xml文件。 首先下载tinyxml,下载地址是:http://sourceforge.net/projects/tinyxml/。解压后,docs是其文档,需要

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解析库是开源的。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读