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
结构图:
XMLNode所有DOM模型节点类的父类,基本节点类;
XMLDocument:文档类,它表示整个xml文件对象;
XMLElement:元素类,它是文件的主要部分,支持嵌套,可以包含属性类和文本类等,是使用最多的类。
XMLText:文本元素类,如:
XMLAttribute:元素属性类,节点的所有属性。不是XMLNode的子类;
XMLDeclaration:声明类,xml文件第一行的内容,声明xml版本,和所用的编码集,很少用到,
如:
XMLComment:注释节点类,注释部分,一般都不会使用这个类。
XMLUnknown:未识别的节点类
用的最多的就是红色标记的2个类。
下面四个都可以带参数来限制查找,不带参数默认第一个;
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():获取文本元素
const char* Name();获取属性名称
const char* Value();获取属性值
const XMLAttribute* Next();获取下一个属性
其实掌握了上面常用的方法,使用tinyxml2就很简单了。
#include
#include
#include
#include "tinyxml2.h" //引用头文件
using namespace std;
using namespace tinyxml2; //使用名称空间
void show_all_node(XMLElement *tmpnode)
{
while(tmpnode)
{
cout<<"<"<Name()<<">";
//获取节点属性第一个
const XMLAttribute* tmp_attr = tmpnode->FirstAttribute();
//遍历整个属性列表
while(tmp_attr)
{
cout<<"attr="<Name()<<":"<Value()<<",";
//获取下一个属性节点
tmp_attr=tmp_attr->Next();
}
if(tmpnode->GetText())//一定要判断不然会有问题,如果文本为空的话,会打印text=后直接结束进程
cout<<" text="<GetText()<<";"<FirstChildElement());//递归掉用,打印子节点所有属性和文本信息
//获取同级别的下一个兄弟元素
tmpnode=tmpnode->NextSiblingElement();
}
}
int main()
{
XMLDocument doc;
doc.LoadFile("./dream.xml");//第一步加载文档
XMLElement*root=doc.RootElement();//获取根元素,通过XMLDocument来获取
cout<Name()<ToDeclaration();
//不能使用doc.FirstChildElement()->ToDeclaration();
decl=doc.FirstChild()->ToDeclaration();
if(decl!=NULL)
{
cout<< decl->Value()<FirstChildElement();
cout<Name()<LastChildElement("LINE");//获取最后一个名称为LINE的元素
cout<Name()<PreviousSiblingElement("SPEAKER");//获取前一个名称为SPEAKER的元素
//获取元素文档内容
if(tmpnode->GetText())//这里要加个判断,不加如果为空的化,下面打印会出问题,目前不知到原因。
{
cout<GetText()<FirstAttribute();//获取元素第一个属性节点,注意返回的是const类型的
cout<Name()<<":"<Value()<Next();//获取下一个属性
cout<Name()<<":"<Value()<Attribute("name")<
dream.xml文件内容,
text node
What, dead, my dove?
Speak, speak. Quite dumb?
PUCK
So, good night unto you all.
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"
SPEECH
LINE
text node
id:1
id:1
speakatt