tinyxml2之解析xml⽂件
tinyxml2是什么?
tinyXML2是⼀个开源的解析XML的C++库,⽤于c++项⽬⾥⾯解析xml⽂件使⽤。
下载地址:
使⽤⽅法:
将下载的源码包⾥⾯的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("./l");//第⼀步加载⽂档
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;//打印名称
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;
}
<?xml version="1.0"?>
<!-- 注释节点-->
<PLAY>
<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>
使用dom4j解析xml文件</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=后直接结束进程。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论