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文档,这里也可以这样写:
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解析库是开源的。
原文链接:https://www.f2er.com/xml/297404.html