tinyXML2是一个开源的解析XML的
C++
库,用于c++项目里面解析xml文件使用。
下载地址:
https://github.com/leethomason/tinyxml2 ,使用git直接将源码下载下来。
使用方法:
将下载的源码包里面的tinyxml2.h,tinyxml2.cpp拷贝到自己的项目, 使用时包含头文件,并且
使用编译指令:using namespace tinyxml2
,编译的时候记得加上
tinyxml2.cpp,
#include"tinyxml2.h"
using namespace tinyxml2;
编译:g++ main.cpp tinyxml2.cpp -o a.out
tinyxml2常用类介绍:
XMLNode
所有
DOM
模型节点类的父类,基本节点类;
XMLDocument
:文档类,
它表示整个
xml
文件对象;
XMLElement
:
元素类,它是文件的主要部分,支持嵌套,可以包含属性类和文本类等,是使用最多的类。
XMLText
:
文本元素类,如:<name>i am student</name>,name节点的
i am student就是文本元素。
XMLAttribute
:
元素属性类,节点的所有属性。不是
XMLNode的子类;
XMLDeclaration
:
声明类,
xml
文件第一行的内容,声明
xml
版本,和所用的编码集,很少用到,
如:
<?xml version="1.0" standalone="yes"?>
XMLComment
:
注释节点类,注释部分,一般都不会使用这个类。
XMLUnknown
:
未识别的节点类
用的最多的就是红色标记的2个类。
XMLElement
常用方法:
下面四个都可以带参数来限制查找,不带参数默认第一个;
XMLElement* FirstChildElement( const char* name = 0):
获取第一子节点,此节点里面包含的第一个节点
XMLElement* LastChildElement( const char* name = 0):
获取最后一个节点
XMLElement* NextSiblingElement( const char* name = 0):
获取下一个兄弟节点,同级别的节点
XMLElement*PreviousSiblingElement( const char* name = 0):
获取上一个兄弟节点
const XMLAttribute* FirstAttribute(void):获取节点的第一个属性,返回的是const类型的。
char *Attribute( const char* name, const char* value=0 ):
根据属性名称,获取属性值,返回char*类型的
属性值
XMLNode*
Parent(void):获取父节点返回的是XMLNode*类型的,可以转换对应的类型xxx.Parent()->ToElement()->Name();
const char* GetText():获取文本元素
XMLAttribute
类常用方法:
const char* Name();获取属性名称
const char* Value();获取属性值
const XMLAttribute* Next();获取下一个属性
其实掌握了上面常用的方法,使用tinyxml2就很简单了。
#include<stdio.h>
#include<string>
#include<iostream>
#include "tinyxml2.h" //引用头文件
using namespace std;
using namespace tinyxml2; //使用名称空间
void show_all_node(XMLElement *tmpnode)
while(tmpnode)
cout<<"<"<<tmpnode->Name()<<">";
//获取节点属性第一个
const XMLAttribute* tmp_attr = tmpnode->FirstAttribute();
//遍历整个属性列表
while(tmp_attr)
cout<<"attr="<<tmp_attr->Name()<<":"<<tmp_attr->Value()<<",";
//获取下一个属性节点
tmp_attr=tmp_attr->Next();
if(tmpnode->GetText())//一定要判断不然会有问题,如果文本为空的话,会打印text=后直接结束进程
cout<<" text="<<tmpnode->GetText()<<";"<<endl;
show_all_node(tmpnode->FirstChildElement());//递归掉用,打印子节点所有属性和文本信息
//获取同级别的下一个兄弟元素
tmpnode=tmpnode->NextSiblingElement();
int main()
XMLDocument doc;
doc.LoadFile("./dream.xml");//第一步加载文档
XMLElement*root=doc.RootElement();//获取根元素,通过XMLDocument来获取
cout<<root->Name()<<endl;
XMLDeclaration *decl;//获取声明不能直接doc->ToDeclaration();
//不能使用doc.FirstChildElement()->ToDeclaration();
decl=doc.FirstChild()->ToDeclaration();
if(decl!=NULL)
cout<< decl->Value()<<endl;
//show_all_node(root);//遍历root节点下的所有节点
//获取第一个节点
XMLElement*tmpnode=root->FirstChildElement();
cout<<tmpnode->Name()<<endl;//打印名称
tmpnode=tmpnode->LastChildElement("LINE");//获取最后一个名称为LINE的元素
cout<<tmpnode->Name()<<endl;//打印名称
tmpnode=tmpnode->PreviousSiblingElement("SPEAKER");//获取前一个名称为SPEAKER的元素
//获取元素文档内容
if(tmpnode->GetText())//这里要加个判断,不加如果为空的化,下面打印会出问题,目前不知到原因。
cout<<tmpnode->GetText()<<endl;
const XMLAttribute*attr=tmpnode->FirstAttribute();//获取元素第一个属性节点,注意返回的是const类型的
cout<<attr->Name()<<":"<<attr->Value()<<endl;//打印属性名称和值
const XMLAttribute*attr2=attr->Next();//获取下一个属性
cout<<attr->Name()<<":"<<attr->Value()<<endl;//打印属性名称和值
cout<<tmpnode->Attribute("name")<<endl;//直接获取name元素属性值
// doc.Print();//打印整个文档内容
return 0;
dream.xml文件内容,
<?xml version="1.0"?>
<!-- 注释节点-->
<SPEECH>
<SPEAKER id="1" name="speakattr">text node</SPEAKER>
<LINE>What, dead, my dove?</LINE>
<LINE>Speak, speak. Quite dumb?</LINE>
</SPEECH>
<SPEECH2>
<SPEAKER id="2" name="speaker2">PUCK</SPEAKER>
<LINE>So, good night unto you all.</LINE>
</SPEECH2>
</PLAY>
liunx环境编译:g++ main.cpp tinyxml2.cpp -o tinytest
./tinytest
PLAY
xml version="1.0"
SPEECH
LINE
text node
id:1
id:1
speakattr
可以去掉遍历节点函数注释:show_all_node(root);
函数打印如下:
./tinytest
PLAY
xml version="1.0"
<PLAY><SPEECH><SPEAKER>attr=id:1,attr=name:speakattr, text=text node;
<LINE> text=What, dead, my dove?;
<LINE> text=Speak, speak. Quite dumb?;
<SPEECH2><SPEAKER>attr=id:2,attr=name:speaker2, text=PUCK;
<LINE> text=So, good night unto you all.;
SPEECH
LINE
text node
id:1
id:1
speakatt
注意事项:tmpnode->GetText()不进行是否为空判断会有问题,如果文本为空的话,会打印text=后直接结束进程。
TinyXML2是simple、small、efficient开源的C++ XML文件解析库,可以很方便的应用到现有的项目之中。非常适合存储简单数据,配置文件,对象序列化等数据量不是很大的操作。TinyXML2详细介绍与源码获取方法详见:TinyXML2官网。
TINYXML2:http://leethomason.github.io/tinyxml2/
TINYXML2全面强于TINYXML。
下面通过几个例程,说明他的使用方法(只有读取部分)。
开发环境配置
从GIT(https://github.com/leethomason/tinyxml2)上下载源代码后,
只要将tnyxml2.h,tinyxml3.cpp,加入工程即可。
要实现对XML文件的解析,首先需要使用github上面的开源组件tinyxml2,将tinyxml2中的tinyxml2.cpp与tinyxml2.h同时复制到项目下面即可。
tinyxml2 github链接
二.程序实现
1.tinyxml组件使用
整个的使用方法与log4cpp的使用方法比较相似,通过程序创建好的XML文件如下:
da...
简而言之,TinyXML-2解析一个XML文档,并从该文档构建一个可以读取、修改和保存的文档对象模型(DOM)。
XML是“可扩展标记语言”的缩写。它是一种通用的人类和机器可读的标记语言,用于描述任意数据。所有为存储应用程序数据而创建的随机文件格式都可以用XML替换。一个解析器。
参考有不同的方法来访问和交互XML数据。TinyXML-2使用文档对象模型(DOM),这意味着XML数据被解析为可以浏览和操作的c++对象,然后写入磁盘或另一个输出流。还可以使用c++对象从头构造XML文档,并将其写入磁盘或另一个
1. TinyXml2 简介
TinyXml 一直是一个非常好用的 Xml 解析工具 , 最新的开源版本 TinyXml2 相对于旧版本的 TinyXml 使用更少的内存 , 更快 , 并且使用更少的内存分配 , 现在是所有开发的重点 , 经过良好的测试 , 是您的最佳选择 , 除非您有维护TinyXML-1代码的要求 ;
TinyXml2 使用类似的 API 到 TinyXml1 和相同的丰...
今天需要对一个xml文件进行解析,网度了下,使用tinyxml2进行处理,该API中封装了较完备的解析处理类,话不多说,正题如下:
1.从官网下载 tinyxml2的API https://github.com/leethomason/tinyxml2 注意下载的版本,我下载时为 tinyxml2-master.zip 的压缩包,将里面的 tinyxml2.h与tinyxml2.cpp文