tinyxml2之解析xml文件

本文档介绍了TinyXML2,一个开源的C++ XML解析库,提供了如何将其添加到项目中、如何编译及使用的基本步骤。主要讲解了XMLElement和XMLAttribute类的关键方法,包括获取子节点、属性等操作,并通过实例展示了如何读取和遍历XML文件内容。此外,还提供了一个简单的Linux编译示例。
摘要由CSDN通过智能技术生成

tinyxml2是什么?

 tinyXML2是一个开源的解析XML的C++库,用于c++项目里面解析xml文件使用。
下载地址:

https://github.com/leethomason/tinyxml2 ,使用git直接将源码下载下来。

测试demo地址(qt可以直接打开):

TinyXML2使用教程(转) - ~小小鸟~ - 博客园

最新2021年9月4日tinyxml2开源的C++XML文件解析库建立的qtpro工程测试+测试说明文档-C++文档类资源-CSDN下载


使用方法:

将下载的源码包里面的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"?>
    <!-- 注释节点-->
     
    <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>
    </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=后直接结束进程。


 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值