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", &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文档,这里也可以这样写:
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解析库是开源的。