使用TinyXML-2解析XML文件

这篇具有很好参考价值的文章主要介绍了使用TinyXML-2解析XML文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、XML介绍

当我们想要在不同的程序、系统或平台之间共享信息时,就需要一种统一的方式来组织和表示数据。XML(EXtensible Markup Language,即可扩展标记语言)是一种用于描述数据的标记语言,它让数据以一种结构化的方式呈现,使得计算机程序能够轻松理解和处理这些数据。

XML有以下特点:

  • 可扩展性:XML 标记集合不是固定的,可以根据需要进行扩展。它允许用户自定义标记,因此可以根据需要创建自定义的数据结构和标记集合,使其适应各种不同的应用场景。
  • 自我描述性:XML 文档包含标签(元素)和属性,这些标签和属性的名称通常反映了其所包含数据的含义。因此,XML 文档本身提供了关于数据结构和含义的信息。
  • 结构化:XML 使用标记来标识数据,并通过元素之间的嵌套关系来表示数据的结构,使其更易于理解和处理。
  • 跨平台性:XML是一种独立于平台和编程语言的标记语言,可以在各种不同的操作系统和软件环境中使用,并且能够轻松地与网络上的其他系统进行数据交换。
  • 数据分离:XML将数据与其格式和结构分离开来,使得数据和显示方式之间有了清晰的分界,这有助于更灵活地管理和维护数据。
  • 通用性:XML 广泛应用于各种领域,例如数据交换、配置文件、Web服务等,因其通用性而受到广泛支持和应用。

二、XML的解析

常见的XML解析方式有以下几种:

  • DOM 解析:DOM(Document Object Model,文档对象模型)解析器会将整个 XML 文档加载到内存中,并将其表示为一个树形结构,开发者可以通过遍历树节点来访问和操作 XML 元素和属性。
  • SAX 解析:SAX(Simple API for XML)解析器是一种基于事件驱动的解析方式,它顺序读取 XML 文档,当遇到 XML 元素、文本或其他事件时,会触发相应的回调函数,开发者可以在回调函数中处理这些事件。
  • XPath:XPath 是一种用于在 XML 文档中定位节点的语言,可以通过路径表达式来指定节点的位置和关系,从而实现对 XML 数据的精确访问和提取。
  • XSLT:可扩展样式表语言转换(EXtensible Stylesheet Language Transformations)是一种基于 XML 的语言,用于对 XML 数据进行转换和处理。可以将XML数据档转换为另外的XML或其它格式,如HTML网页,纯文字等。
  • 第三方库和工具:除了语言内置的解析库外,还有许多第三方库和工具可用于解析 XML 文件,如 lxml(Python)、Jsoup(Java)、XmlReader(C#)等。

三、TinyXML-2简介

TinyXML-2 是一个简单、小型、高效的 C++ XML 解析器,可被轻易地集成到其他程序中。它使用文档对象模型(DOM)的方式解析XML,可使用它解析 XML 文档,并读取、修改和保存的文档对象模型。

使用TinyXML-2可以实现对XML文件的:创建、解析、修改等功能。

该项目的GitHub链接如下:

TinyXML-2 【github项目】

也可以从此处下载TinyXML2源码(免费,不需要积分):

【免费】XML解析工具-TinyXML2-源代码-C++资源-CSDN文库

四、XML解析示例

4.1 创建测试用的XML文件

创建testXML.xml,内容如下所示:

<?xml version="1.0" encoding="utf-8"?>
<!--for test-->
<system>
  <android>
    <NULL>null</NULL>
  </android>

  <windows>
    <windows7>
      <apps>
        <app>windows7 c</app>
        <app>windows7 c++</app>
        <app>windows7 java</app>
        <app>windows7 python</app>
      </apps>
    </windows7>
    <windows10>
      <apps>
        <app>windows10 c</app>
        <app>windows10 c++</app>
        <app>windows10 java</app>
        <app>windows10 python</app>
      </apps>
    </windows10>
    <windows11>
      <apps>
        <app>windows11 c</app>
        <app>windows11 c++</app>
        <app>windows11 java</app>
        <app>windows11 python</app>
      </apps>
    </windows11>
  </windows>

  <linux>
    <ubuntu>
      <apps>
        <app>ubuntu_c</app>
        <app>ubuntu_c++</app>
        <app>ubuntu_java</app>
        <app>ubuntu_python</app>
      </apps>
    </ubuntu>
    <centos>
      <apps>
        <app>centos_c</app>
        <app>centos_c++</app>
        <app>centos_java</app>
        <app>centos_python</app>
      </apps>
    </centos>
  </linux>
</system>

注:

- 根元素为 system ,其中包含 android、windows、linux三个操作系统大类。

- 每个操作系统大类下又包含具体的操作系统版本,如windows包含windows7、windows10、windows11等。

- 对每一个具体的操作系统版本,包含了用以存储若干app的 apps 。

- 每个应用存储到具体的某个app中。

4.2 拷贝TinyXML-2项目的代码

将TinyXML-2项目中的 tinyxml2.cpp、tinyxml2.h 两个文件拷贝到当前的工作目录。

4.3 编写XML解析的测试代码

本次以 读取并输出 “某类操作系统” 中的 “各个具体操作系统版本” 的 “app内容” 为例:

创建readxml.cpp并编辑,该文件内容如下:

#include <iostream>
#include <vector>
#include "tinyxml2.h"

using namespace tinyxml2;
using namespace std;

//定义结构体OS_APPS以进行数据存储
typedef struct os_apps{
    string osname;
    vector<string> apps;
} OS_APPS;

//输出容器中的所有信息
void show(vector<OS_APPS> &v)
{
    cout<<"\n----------print----------" << endl;
    for(OS_APPS oa : v)
    {
        cout << "osname: " << oa.osname << endl;
        int cnt = 1;
        for(auto app : oa.apps)
        {
            cout << "app" << cnt << ": " << app << endl;
            cnt ++;
        }
        cout << endl;
    }
}

//从XMLDocument中读取指定的操作系统大类,并存储到容器中
void read_xml(XMLDocument* doc, vector<OS_APPS> &v, const char* target_os)
{
    // 获取根元素
    XMLElement* root = doc->RootElement(); 
    if (!root) {
        std::cout << "No root element found!" << std::endl;
        exit(1);
    }

    // 查找指定OS类别
    XMLElement* os_element = root->FirstChildElement(target_os);
    if (!os_element) 
    {
        // 未找到指定元素
        cout << "os_element not found!" << endl;
        exit(1);
    }

    
    // 遍历所有指定分类下的所有子OS
    XMLElement* sub_os_element = os_element -> FirstChildElement();
    if(!sub_os_element)
    {
        cout << "can't get sub_os_element!" << endl;
        exit(1);
    }

    while(sub_os_element)
    {
        OS_APPS oa;
        vector<string> s;

        //获取子操作系统的名称
        oa.osname = sub_os_element -> Value();

        //获取存储apps列表的节点
        XMLElement* apps_element = sub_os_element -> FirstChildElement();
        if(!apps_element)
        {
            cout << "can't read " << oa.osname << "'apps, please check XML file!" << endl;
            exit(1);
        }
        else
        {
            cout << "begin to read " << oa.osname << "'s apps" << endl;
        }

        //获取每一个app元素,并继续读取其他同级app内容
        XMLElement* app_element = apps_element -> FirstChildElement();
        while(app_element)
        {
            s.push_back(app_element -> GetText());
            app_element = app_element -> NextSiblingElement();
        }

        //存储
        oa.apps = s;
        v.push_back(oa);

        //继续处理同级的其他子OS
        sub_os_element = sub_os_element -> NextSiblingElement();
    }

}


int main( int argc, const char ** argv)
{
    //读取的数据将存放在容器v中
    vector<OS_APPS> v;

    //参数校验
    if(argc == 1)
    {
        cout << "please input the XML filename!" << endl;
        exit(0);
    }

    //打开文件
    XMLDocument* doc = new XMLDocument();
    doc->LoadFile( argv[1] );
    if (doc->ErrorID() != XML_SUCCESS) 
    {
        cout << "Error loading XML file!" << endl;
        return 1;
    }
    printf( "XML file '%s' is loaded.\n", argv[1]);

    //读取指定类别信息,并存储到容器v中
    read_xml(doc, v, "windows");

    //输出读取的信息
    show(v);
    
    return 0;
}

4.4 生成可执行程序

在命令行执行以下命令:

g++ -g -c tinyxml2.cpp -o tinyxml2.o
g++ -g -c readxml.cpp -o readxml.o

g++ -g -o read_xml_test tinyxml2.o readxml.o

4.5 执行程序

执行程序:

./read_xml_test testXML.xml

执行结果如下所示:

使用TinyXML-2解析XML文件,TinyXML,xml解析,c++

可以看到,XML中的文件已经被成功读取。

五、示例代码下载

这里是以上测试代码文件(为了方便测试,补充了makefile文件和shell脚本)。

run_test.sh          shell文件,清理当前目录,重新执行make命令,并运行代码

Makefile              makefile文件,编译并链接项目
readxml.cpp        XML解析测试源文件
tinyxml2.cpp        TinyXML-2 源文件
tinyxml2.h            TinyXML-2头文件

testXML.xml        测试用xml文件

 执行结果如下:

 使用TinyXML-2解析XML文件,TinyXML,xml解析,c++

 下载链接:

【免费】XML解析示例项目-读取并输出xml的指定内容示例资源-CSDN文库

 

 六、函数的参数及功能

在tinyxml2.h 中,给出了函数的定义,功能及参数类型,可根据需求寻找与使用相应的函数。

使用TinyXML-2解析XML文件,TinyXML,xml解析,c++

 

 

 

如有不当或错误之处,恳请您的指正,谢谢!!!文章来源地址https://www.toymoban.com/news/detail-828338.html

到了这里,关于使用TinyXML-2解析XML文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • QT解析xml文件

    mainwindow.cpp  mainwindow.h

    2024年02月14日
    浏览(38)
  • java解析xml文件

    MyContentHandler类继承自DefaultHandler,是一个自定义的内容处理器。在该类中重写了startElement()、endElement()和characters()方法,以处理XML解析的不同事件。

    2024年02月13日
    浏览(47)
  • Java中解析XML文件

            XML(EXtensible Markup Language),可扩展标记语言,相比于HTML可以自定义标签,不遵循W3C标准         XML特点:跨平台、跨语言、跨系统。XML与操作系统、编程语言的开发平台无关。         XML作用:①数据交互②使用XML文件配置应用程序和网站 1.文档声明 包括文档

    2024年02月09日
    浏览(52)
  • Qt XML文件解析 QDomDocument

    QtXml模块提供了一个读写XML文件的流,解析方法包含DOM和SAX,两者的区别是什么呢? DOM(Document Object Model):将XML文件保存为树的形式,操作简单,便于访问。 SAX(Simple API for XML):接近于底层,速度较快,但不便于访问。 如果要使用XML时,.pro文件中添加:  使用时添加文件

    2024年02月10日
    浏览(51)
  • Qt中XML文件创建及解析

    QT的配置文件中添加xml选项: 头文件:#include QXmlStreamWriter 写入的文件如图:   头文件:#include QXmlStreamReader  解析其中的Hobby模块: 输出结果:  

    2024年02月11日
    浏览(37)
  • 解析xml文件,获取需要的数据并写入txt文件中

    =_=  话不多说!直接上代码!=_= 1、XmlUtil.java     xml解析工具类  2、测试代码 解析xml方式还有很多种,这只是其中一种,可以参考:Java XML解析 - 利用dom(org.w3c.dom)解析XML  

    2024年02月14日
    浏览(39)
  • Spring源码(五)— 解析XML配置文件(二) 定制化标签解析流程

    上一篇以bean标签为例,介绍了属于defaultNamesapce标签的解析流程,但是defaultNamespace中默认的标签只有bean、beans、alias、import这四个,而我们平时在xml中配置的标签有很多。那其余的标签是如何解析? 在这篇文章会详细介绍定制化标签的解析流程。 注:除defaultNamesapce所属的4个

    2024年02月15日
    浏览(65)
  • Javaweb之Mybatis的XML配置文件的详细解析

    Mybatis的开发有两种方式: 注解 XML 使用Mybatis的注解方式,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用XML来配置映射语句,也就是将SQL语句写在XML配置文件中。 在Mybatis中使用XML映射文件方式开发,需要符合一定的规范: XML映射文件的名称

    2024年01月24日
    浏览(55)
  • Unity 数据读取|(五)XML文件解析(XmlDocument,XmlTextReader)

    XML ,全称为可扩展标记语言( eXtensible Markup Language ),是一种用于描述、传输和存储数据的语言。它被设计用来传输和存储数据,与 HTML 不同,XML 的主要目的不在于显示数据,而是强调数据的结构性。XML 使用类似 HTML 的标签表示数据的结构和其他信息。 XML的优点: 易于人

    2024年02月05日
    浏览(63)
  • Spring源码之XML文件中Bean标签的解析1

    xml文件里包含Bean的信息,为了避免多次IO,需要一次性读取xml文件中所有bean信息,加入到Spring工厂。 读取配置文件 ClassPathResource是Spring封装的一个类型; Resource接口 :可以读取相关资源文件的内容 获得输入流;可读取的类型,不仅包括本地的xml、 properties、txt 等文件,还包

    2024年02月13日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包