XML解析库tinyxml2库使用详解

news2024/11/16 13:25:55

XML语法规则介绍及总结-CSDN博客        

        TinyXML-2 是一个简单轻量级的 C++ XML 解析库,它提供了一种快速、高效地解析 XML 文档的方式。

1. 下载地址

        Gitee 极速下载/tinyxml2

 2. 基本用法

下面将详细介绍 TinyXML-2 的主要使用方法:        

2.1. 引入头文件和命名空间

#include "tinyxml2.h"
using namespace tinyxml2;

2.2. 解析 XML 文档

XMLDocument doc;
doc.LoadFile("example.xml");
if (doc.ErrorID() != XML_SUCCESS) {
    // 处理错误
    return;
}

2.3. 访问根节点

XMLElement* root = doc.RootElement();

2.4. 遍历子节点

for (XMLElement* elem = root->FirstChildElement(); elem; elem = elem->NextSiblingElement()) {
    // 处理节点
}

2.5. 读取节点属性

const char* attr = elem->Attribute("name");
if (attr) {
    // 处理属性值
}

2. 6. 读取节点文本内容

const char* text = elem->GetText();
if (text) {
    // 处理文本内容
}

2.7. 除了遍历和读取节点,TinyXML-2 还提供了丰富的节点操作 API,包括创建、插入、删除、克隆节点等。

// 创建新节点并插入到现有节点下
XMLElement* newElem = doc.NewElement("new_element");
root->InsertEndChild(newElem);

// 删除节点
root->DeleteChild(newElem);

// 克隆节点
XMLElement* clonedElem = newElem->DeepClone(&doc);
root->InsertEndChild(clonedElem);

2.8. 创建新节点并添加到文档

XMLElement* newElem = doc.NewElement("new_element");
newElem->SetAttribute("attribute", "value");
newElem->SetText("New element text");
root->InsertEndChild(newElem);

2.9. 文档操作

TinyXML-2 不仅可以解析现有的 XML 文档,还可以创建新的 XML 文档,并进行保存和打印操作。

// 创建新文档
XMLDocument doc;
XMLDeclaration* decl = doc.NewDeclaration();
doc.InsertFirstChild(decl);
XMLElement* root = doc.NewElement("root");
doc.InsertEndChild(root);

// 保存文档
doc.SaveFile("new_document.xml");

// 打印文档
doc.Print();

 2.10. 保存 XML 文档

doc.SaveFile("new_example.xml");

2.11. 错误处理

        TinyXML-2 提供了丰富的错误处理机制。您可以通过检查 doc.ErrorID() 和 doc.ErrorName() 来获取错误编号和错误信息。

if (doc.ErrorID() != XML_SUCCESS) {
    printf("Error loading file: %s\n", doc.ErrorName());
    return;
}

2.12.内存管理

        TinyXML-2 使用自己的内存管理机制,无需手动分配和释放内存。所有的内存分配和释放都由库内部完成。

3. 代码示例

生成一个xml,用于保存照片路径,GPS信息及缺陷信息等。

#include "tinyxml2.h"
#include <string>
using namespace tinyxml2;

int SaveInfo(std::string xmlFile, std::string imagePath, 
                            std::string *calssName, int calssNameNum, 
                            double lon, double lat, double alt)
{
    XMLDocument* doc = new XMLDocument();
    if(doc == NULL)
    {   
        printf("New  xml is NULL!\n");
        return -1;
    }

    if(xmlFile.empty())    
    {
        printf("xmlFile path is NULL!\n");
        return -1;
    }
    // 创建xml
    const char* declaration ="<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>";
    doc->Parse(declaration);//会覆盖xml所有内容
    
    //创建根目录
    XMLElement* root = doc->NewElement("Result");
    doc->InsertEndChild(root);
    //路径
    XMLElement* imagePathNode = doc->NewElement("imagePath");
    imagePathNode->InsertEndChild(doc->NewText(imagePath.c_str()));
    root->InsertEndChild(imagePathNode);
    //缺陷类别
    XMLElement* classTypeNode = doc->NewElement("classType");
    for(int i = 0; i < calssNameNum; i++)
    {
        XMLElement* classNameNode = doc->NewElement("className");
        XMLText* classNameText=doc->NewText(calssName[i].c_str()); 
        classNameNode->InsertEndChild(classNameText);
        classTypeNode->InsertEndChild(classNameNode);
    }
    root->InsertEndChild(classTypeNode);
    
    //经度
    XMLElement* gpsNode = doc->NewElement("gps");
    XMLElement* longitudeNode = doc->NewElement("longitude");
    XMLText* lonText=doc->NewText(std::to_string(lon).c_str()); 
    longitudeNode->InsertEndChild(lonText);
    //纬度
    XMLElement* latitudeNode = doc->NewElement("latitude");
    XMLText* latText=doc->NewText(std::to_string(lat).c_str()); 
    latitudeNode->InsertEndChild(latText);
    //高度
    XMLElement* altitudeNode = doc->NewElement("altitude");
    XMLText* altText=doc->NewText(std::to_string(alt).c_str());
    altitudeNode->InsertEndChild(altText);
    
    gpsNode->InsertEndChild(longitudeNode);
    gpsNode->InsertEndChild(latitudeNode);
    gpsNode->InsertEndChild(altitudeNode);
    root->InsertEndChild(gpsNode);
    if(XML_SUCCESS != doc->SaveFile((char *)xmlFile.c_str()))
    {
        printf("ERROR: Save xml:%s fail\n", xmlFile.c_str());
        doc->PrintError();
        return -1;
    }
    printf("Save xmlFile success!\n");
    return 0;
}

运行结果:

4. 总结

        TinyXML-2 是一个功能强大、易用的 XML 解析库,适合各种 C++ 项目使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1793428.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux操作系统:Redis在虚拟环境下的安装与部署

Redis下载方法 最近部署项目的时候用到了Redis&#xff0c;自己在安装的时候也碰到了一些列问题最终安装成功&#xff0c;记录一下自己的安装历程。前期准备&#xff1a; 服务器Linux版本&#xff1a;Centos8.4 64位&#xff08;http://isoredirect.centos.org/centos/8/isos/…

Django 部署指南

部署 Django 应用程序涉及将我们的应用程序从开发环境部署到生产环境&#xff0c;并确保它可以在生产服务器上安全运行和扩展。其实了解几种部署方案&#xff0c;相信你对将来的项目更得心应手。 1、问题背景 Django 是一款流行的 Python Web 框架&#xff0c;但对于新手来说&…

Parallels Desktop 优化大学 IT 环境的八大最佳实践

在不断变化的大学 IT 环境中&#xff0c;优化资源和确保无缝运营至关重要。Parallels Desktop 是学术用户弥合 Mac 和 Windows 环境之间差距的强大工具。 大学 IT 部门可以在很多方面受益于 Parallels Desktop&#xff0c;主要原因是它使 IT 管理员能够提供让 Mac 用户无缝运行…

Aigtek功率放大器由什么组成

功率放大器是一种电子设备&#xff0c;用于将输入信号的功率增加到更高的水平&#xff0c;以驱动负载或输出设备。它由多个组件和电路构成&#xff0c;以实现信号放大和传输。 下面是功率放大器的主要组成部分&#xff1a; 输入级&#xff1a;输入级是功率放大器的第一个阶段&a…

C++学习笔记“类和对象”:继承;

目录 4.6 继承 4.6.1 继承的基本语法 4.6.2 继承方式 4.6.3 继承中的对象模型 4.6.4 继承中构造和析构顺序 4.6.5 继承同名成员处理方式 4.6.6 继承同名静态成员处理方式 4.6.7 多继承语法 4.6.8 菱形继承 4.6 继承 继承是面向对象三大特性之一 有些类与类之间存在…

HTML+CSS 图片轮播卡片

效果演示 实现了一个图片轮播卡片的效果,包括一个容器(.container)、一个卡片(.card)、一个图片(.img)、一个内容区域(.content)和一个滑动条(.slider)。卡片包含一张图片和一些文本内容,图片可以通过滑动条进行切换。整个卡片具有圆角和阴影效果,使其看起来更加美…

嵌入式之存储基本知识

系列文章目录 嵌入式之存储基本知识 嵌入式之存储基本知识 系列文章目录一、RAM与ROM二、DRAM和SRAM三、SDRAM&#xff08;DRAM的一种&#xff09;四、DDR 一、RAM与ROM RAM&#xff08;随机存取存储器&#xff09;和ROM&#xff08;只读存储器&#xff09;是两种不同类型的计…

COMPUTEX 2024正式开启:华硕NUC带您领略全芯AI体验

6月4日&#xff0c;一年一度的台北国际电脑展&#xff08;COMPUTEX 2024&#xff09;在中国台北拉开序幕&#xff0c;以“AI串联&#xff0c;共创未来”为主题&#xff0c;将全球的科技企业汇聚于此&#xff0c;并推出多项新技术及产品。 华硕也在这场科技盛会中展示了多款创新…

Nvidia Jetson/Orin +FPGA+AI大算力边缘计算盒子:无人机自主飞行软件平台

案例简介 北京泛化智能科技有限公司&#xff08;gi&#xff09;所主导开发的 Generalized Autonomy Aviation System (GAAS) 是为无人机以及城市空中交通 (UAM, Urban Air Mobility) 所设计的开源无人机自主飞行框架。通过 SLAM、路径规划和 Global Optimization Graph 等功能…

wordpress里面嵌入哔哩哔哩视频的方法

我们正常如果从blibli获取视频分享链接然后在wordpress里面视频URL插入&#xff0c;发现是播放不了的 而视频嵌入代码直接粘贴呢窗口又非常的小 非常的难受&#xff0c;就需要更改一下代码。你可以在在allowfullscreen"true"的后面&#xff0c;留1个空格&#xff…

小白跟做江科大32单片机之LED闪烁

原理介绍 原理介绍详见&#xff1a; 【STM32】江科大STM32学习笔记汇总(已完结)_stm32江科大笔记-CSDN博客https://blog.csdn.net/u010249597/article/details/134762513 项目准备 1.在项目文件夹中新建3-1 LED文件夹 2.keil新建项目&#xff0c;打开新建的3-1 LED&#xf…

crossover mac好用吗 CrossOver Mac怎么下载 Mac用crossover损害电脑吗

CrossOver 是一款可以让Mac用户能够自由运行和游戏windows游戏软件的虚拟机类应用&#xff0c;虽然能够虚拟windows但是却并不是一款虚拟机&#xff0c;也不需要重启系统或者启动虚拟机&#xff0c;类似于一种能够让mac系统直接运行windows软件的插件。它以其出色的跨平台兼容性…

超声波清洗机哪个品牌比较好耐用?四大知名爆款王牌安利!

随着科技的不断进步&#xff0c;超声波眼镜清洗机成为了眼镜清洗的新选择。它利用了超声波技术来彻底清洁眼镜&#xff0c;去除顽固的污渍和细菌。由于市面上关于超声波清洗机的型号选择实在是太多了&#xff0c;让很多真心想要选购超声波清洗机的朋友犯了难。纠结着不知道应该…

SQL实验 带函数查询和综合查询

一、实验目的 1&#xff0e;掌握Management Studio的使用。 2&#xff0e;掌握带函数查询和综合查询的使用。 二、实验内容及要求 1&#xff0e;统计年龄大于30岁的学生的人数。 --统计年龄大于30岁的学生的人数。SELECT COUNT(*) AS 人数FROM StudentWHERE (datepart(yea…

python语言中循环语句的小结

如上图所示&#xff0c;在C/C/Java中如果使用的for循环语句和do while语句都与python中的while循环语句类似&#xff0c;所以在C/C/Java中如果使用的for循环语句在python中可以用while语句来替换。

python批量调整word含有关键字句子样式

代码&#xff1a; from docx import Document from docx.shared import RGBColor obj Document(装机必读调整样式.docx) word 软件 def set_run(run):#设置run的字体大小、是否加粗以及字体颜色run.font.size font_sizerun.bold boldrun.font.color.rgb color for p in obj.…

小型气象站—农田环境进行气象监测

TH-QC8小型气象站在农田环境进行气象监测的应用非常广泛&#xff0c;它能够提供准确、及时的气象数据&#xff0c;为农业生产提供有力的支持。以下是关于小型气象站在农田环境气象监测中的具体应用和相关特点&#xff1a; 小型气象站能够实时监测农田环境中的气象参数&#xff…

实战经验:升级主键类型为 BigInt 的应用程序兼容性保证文章:

在数据库设计和应用开发中&#xff0c;主键的类型选择至关重要。当需要处理更大数据量或提升数据完整性时&#xff0c;将主键类型从其他类型升级为 BigInt 是一种常见做法。然而&#xff0c;这可能会导致应用程序的兼容性问题。以下是确保应用程序完美兼容的一些实战经验。 文档…

HarmonyOS(31) @Prop标签使用指南

Prop Prop简介State和Prop的同步场景使用示例参考资料 Prop简介 子组件中Prop装饰的变量可以和父组件建立单向的同步关系。子组件Prop装饰的变量是可变的&#xff0c;但是变化不会同步回其父组件。Prop变量允许子组件修改&#xff0c;但修改后的变化不会同步回父组件。当父组件…

【ARM】PK51-如何添加芯片型号的方法

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 遇到打开工程提示没有该芯片设备提示如何解决。 2、 问题场景 客户发来一个工程文件&#xff0c;打开后软件提示没有发现该芯片设备提示。 图 1 3、软硬件环境 1&#xff09;、软件版本&#xff1a;keil μvision…