开源库TinyXML2简介及使用

2023-11-17

TinyXML2是一个开源、简单、小巧、高效的C++ XML解析器,它只有一个.h文件和一个.cpp文件组成,可以轻松集成到其它程序中。它解析XML文档并从中构建可以读取、修改和保存的文档对象模型(Document Object Model, DOM)。它不能解析DTD(Document Type Definitions, 文档类型定义)或XSL(eXtensible Stylesheet Language, 扩展样式表语言)。在TinyXML2中,XML数据被解析为可以浏览和操作的C++对象,然后写入磁盘和其它输出流。它不依赖于C++的STL。

TinyXML2的license为ZLib,可以商用,它的源码在https://github.com/leethomason/tinyxml2 ,最新发布版本为7.1.0。

关于XML的介绍可以参考:https://blog.csdn.net/fengbingchun/article/details/38978591

以下是测试代码(test_tinyxml2.cpp):创建XML(test_tinyxml2_create)和解析XML(test_tinyxml2_parse)

#include "funset.hpp"
#include <iostream>
#include "tinyxml2.h"

int test_tinyxml2_create()
{
	const char* declaration = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
	tinyxml2::XMLDocument doc;
	tinyxml2::XMLError ret = doc.Parse(declaration);
	if (ret != 0) {
		fprintf(stderr, "fail to parse xml file: %s\n", declaration);
		return -1;
	}

	tinyxml2::XMLComment* comment = doc.NewComment("this is a xml test file");
	doc.InsertEndChild(comment);

	tinyxml2::XMLElement* root = doc.NewElement("Root");
	doc.InsertEndChild(root);

	// User
	tinyxml2::XMLElement* user = doc.NewElement("User");
	user->SetAttribute("Name", "fengbingchun");
	root->InsertEndChild(user);

	tinyxml2::XMLElement* blog = doc.NewElement("Blog");
	tinyxml2::XMLText* text1 = doc.NewText("CSDN");
	blog->InsertEndChild(text1);
	user->InsertEndChild(blog);
	
	tinyxml2::XMLElement* code = doc.NewElement("Code");
	tinyxml2::XMLText* text2 = doc.NewText("GitHub");
	code->InsertEndChild(text2);
	user->InsertEndChild(code);
	
	// Blog
	tinyxml2::XMLElement* blog2 = doc.NewElement("Blog");
	blog2->SetAttribute("Name", "CSDN");
	root->InsertEndChild(blog2);

	tinyxml2::XMLElement* addr = doc.NewElement("Address");
	tinyxml2::XMLText* text3 = doc.NewText("https://blog.csdn.net/fengbingchun");
	addr->InsertEndChild(text3);
	blog2->InsertEndChild(addr);
	
	tinyxml2::XMLElement* id = doc.NewElement("ID");
	tinyxml2::XMLText* text4 = doc.NewText("fengbingchun");
	id->InsertEndChild(text4);
	blog2->InsertEndChild(id);

	// Code
	tinyxml2::XMLElement* code2 = doc.NewElement("Code");
	code2->SetAttribute("Name", "GitHub");
	root->InsertEndChild(code2);

	tinyxml2::XMLElement* addr2 = doc.NewElement("Address");
	tinyxml2::XMLText* text5 = doc.NewText("https://github.com//fengbingchun");
	addr2->InsertEndChild(text5);
	code2->InsertEndChild(addr2);
	
	tinyxml2::XMLElement* repositories = doc.NewElement("Repositories");
	tinyxml2::XMLText* text6 = doc.NewText("27");
	repositories->InsertEndChild(text6);
	code2->InsertEndChild(repositories);

#ifdef _MSC_VER
	const char* file_name = "E:/GitCode/Messy_Test/testdata/test.xml"; 
#else
	const char* file_name = "testdata/test.xml";
#endif

	ret = doc.SaveFile(file_name);
	if (ret != 0) {
		fprintf(stderr, "fail to save xml file: %s\n", file_name);
		return -1;
	}

	return 0;
}

int test_tinyxml2_parse()
{
#ifdef _MSC_VER
	const char* file_name = "E:/GitCode/Messy_Test/testdata/test_tinyxml2.xml"; 
#else
	const char* file_name = "testdata/test_tinyxml2.xml";
#endif

	tinyxml2::XMLDocument doc;
	tinyxml2::XMLError ret = doc.LoadFile(file_name);
	if (ret != 0) {
		fprintf(stderr, "fail to load xml file: %s\n", file_name);
		return -1;
	}

	tinyxml2::XMLElement* root = doc.RootElement();
	fprintf(stdout, "root element name: %s\n", root->Name());

	// User
	tinyxml2::XMLElement* user = root->FirstChildElement("User");
	if (!user) {
		fprintf(stderr, "no child element: User\n");
		return -1;
	}
	fprintf(stdout, "user name: %s\n", user->Attribute("Name"));

	tinyxml2::XMLElement* blog = user->FirstChildElement("Blog");
	if (!blog) {
		fprintf(stderr, "no child element: Blog, in User\n");
		return -1;
	}
	fprintf(stdout, "blog value: %s\n", blog->GetText());
	fprintf(stdout, "code value: %s\n\n", user->FirstChildElement("Code")->GetText());
	
	// Blog
	tinyxml2::XMLElement* blog2 = root->FirstChildElement("Blog");
	if (!blog2) {
		fprintf(stderr, "no child element: Blog\n");
		return -1;
	}
	fprintf(stdout, "blog name: %s\n", blog2->Attribute("Name"));

	tinyxml2::XMLElement* addr = blog2->FirstChildElement("Address");
	if (!addr) {
		fprintf(stderr, "no child element: Address, in Blog\n");
		return -1;
	}
	fprintf(stdout, "address value: %s\n", addr->GetText());
	fprintf(stdout, "id value: %s\n\n", blog2->FirstChildElement("ID")->GetText());
	
	// Code
	tinyxml2::XMLElement* code = root->FirstChildElement("Code");
	if (!code) {
		fprintf(stderr, "no child element: Code\n");
		return -1;
	}
	fprintf(stdout, "code name: %s\n", code->Attribute("Name"));

	tinyxml2::XMLElement* addr2 = code->FirstChildElement("Address");
	if (!addr2) {
		fprintf(stderr, "no child element: Address, in Code\n");
		return -1;
	}
	fprintf(stdout, "address value: %s\n", addr2->GetText());
	fprintf(stdout, "repositories value: %s\n\n", code->FirstChildElement("Repositories")->GetText());

	return 0;
}

创建xml文件的执行结果如下:

<?xml version="1.0" encoding="UTF-8"?>
<!--this is a xml test file-->
<Root>
    <User Name="fengbingchun">
        <Blog>CSDN</Blog>
        <Code>GitHub</Code>
    </User>
    <Blog Name="CSDN">
        <Address>https://blog.csdn.net/fengbingchun</Address>
        <ID>fengbingchun</ID>
    </Blog>
    <Code Name="GitHub">
        <Address>https://github.com//fengbingchun</Address>
        <Repositories>27</Repositories>
    </Code>
</Root>

解析以上xml文件输出结果如下:

GitHub:https://github.com/fengbingchun/Messy_Test

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

开源库TinyXML2简介及使用 的相关文章

  • 使用Matlab生成随机数数组的方法

    使用Matlab生成随机数数组的方法 在Matlab中 我们可以使用rand randn和randi函数来生成随机数数组 下面 我们将分别介绍这些函数的使用方法 rand函数 rand函数用于生成一个由0到1之间的随机数构成的矩阵 可以指定
  • Mybatis 延迟加载使用

    在一对一映射中使用 首先配置延迟加载 需要在mybatis xml中配置
  • Ubuntu下安装GMP

    记得安装m4 GMP下载地址 https gmplib org 1 进入官网 下载最新安装包 2 解压得到gmp xxx 3 进入文件夹 cd gmp 6 2 1 4 安装m4 如果没有这步 第六步将报错 sudo apt get inst
  • 【开发工具】【Dropbear】Dropbear编译安装

    简介 dropbear 小型的嵌入式系统专用的SSH服务端和客户端工具 服务器端 dropbear dropbearkey 客户端 dbclient dropbear默认使用nsswitch实现名称解析 账户名称 dropbear会在用户登
  • Flutter倒计时定时器

    Timer void countdown Timer timer new Timer new Duration seconds 10 只在倒计时结束时回调
  • 二叉树各种函数的实现

    如果你觉得迷茫 那就尽可能选择比较困难的路 目录 前言 一 通过前序遍历创建二叉树 二 二叉树的四种遍历 1 二叉树的前序遍历 2 二叉树的中序遍历 3 二叉树的后序遍历 4 二叉树的层序遍历 三 二叉树的结点个数 四 二叉树的叶子结点的个
  • Linux查看当前目录及子目录大小

    du h max depth 1 var lib docker 查看 var lib docker 目录及该目录直接子目录各文件及文件夹大小 查看效果如下图 改变 max depth 1 中的数值大小就可以指定查看该目录下多少级子目录 例如
  • Oracle---day03

    一 视图 对一个查询结果的封装 视图里面所有的数据都是来自于它查询的那张表 视图里面不存储任何数据 视图的好处 1 能够封装复杂的查询结果 2 屏蔽表中的细节 语法 create or replace view 视图名字 as 查询语句 w
  • 【Python】斐波那契数列之兔子问题

    目录 兔子问题 1 1 问题描述 1 2 问题分析 1 3 解决实现 兔子问题 1 1 问题描述 斐波那契在计算之书中 提出了一个有趣的兔子问题 若一对成年兔子每个月恰好生下一对小兔子 一雌一雄 在年初时只有一对小兔子 在第一个月结束时 他
  • linux No module named yum错误的解决办法

    linux No module named yum错误的解决办法 肯定是yum的版本与当前python的版本不一致造成的 所以修改yum的配置 修改文件 vim usr bin yum 修改头 usr bin python gt usr b
  • STM32擦除Flash失败

    stm32 Flash擦除错误 环境 keil5 stm32f4 rtthread3 15 现象 擦除flash总是失败 经过jlink调试发现PGPERR位总是1 经过一番折腾 在st社区找到答案 链接 https community s
  • Button点击事件绑定中如何传递带参数的方法

    btn onClick AddListener delegate this OnBtnClick true 传递一个有参数的方法用于传递参数 这样点击事件就能接收参数了 using UnityEngine using UnityEngine
  • 华为OD机试真题- 计算误码率-2023年OD统一考试(B卷)

    题目描述 误码率是最常用的数据通信传输质量指标 它可以理解为 在多少位数据中出现一位差错 移动通信网络中的误码率主要是指比特误码率 其计算公式如下 比特误码率 错误比特数 传输总比特数 为了简单 我们使用字符串来标识通信的信息 一个字符错误
  • CSS布局之使用Flex布局画骰子(3点)

    若无基础 请优先阅读学习此文档阮一峰 Flex 布局教程 语法篇 上一篇文章CSS布局之使用Flex布局画骰子 2点 这次画3个点的骰子 大家可以先看图片默写代码 然后与文中代码做校验 来验证自己是否理解了Flex布局 骰子样式 div c

随机推荐

  • 笔试

    给定两个字符串s1和s2 如果s1删除若干个字符后变成s2 则称s2为s1的子串 求s2在s1中的起始位置的最大值 输入描述 只有一行 s1 s2 s1和s2用空格隔开 s1和s2度不会含有空格 s1和s2的长度均大于1且小于256 输出描
  • python实战故障诊断之CWRU数据集(三):信号预白化处理-倒谱预白化(CEP pre-whitening)

    文章目录 1 概述 2 倒频谱预白化原理 2 1 倒频谱 2 2 基于倒频谱的预白化处理 3 代码实现 1 概述 在轴承故障中 故障信号通常较为微弱 很可能被设备周期性运转产生的强周期性信号所淹没 导致无法准确识别故障 这时我们需要用到信号
  • PCL .vtk文件与.pcd的相互转换

    目录 一 概述 二 VTK转PCD 三 PCD转VTK 四 实验数据 一 概述 多边形数据集vtkPolyData由顶点 多顶点 线 折线和三角形地带等单元组成 顶点 线和多边形构成了用来表达0 1和2维几何图形的基本要素的最小集合 vtk
  • KubeSphere中集成ApiSix

    KubeSphere中集成ApiSix 一 Apache APISIX 介绍 Apache APISIX 是一款开源的高性能 动态云原生网关 由深圳支流科技有限公司于 2019 年捐赠给 Apache 基金会 当前已经成为 Apache 基
  • java装饰器模式

    一 装饰器模式定义 1 动态地给一个对象添加一些额外的职责 就增加功能来说 装饰模式相比生成子类更为灵活 Component抽象构件 Component是一个接口或者是抽象类 就是定义我们最核心的对象 也就是最原始的对象 定义一个对象接口可
  • Python运行不了,无法运行Python解决办法(超全面)

    前言 Python是一门广泛使用的编程语言 但在使用过程中 我们可能会遇到无法运行Python的问题 本文将提供一个超全面的解决方案 帮助读者排除常见的Python运行问题 并提供相应的解决办法 帮助Python学习 以下所有学习资料文末免
  • tensorflow安装教程(一般使用国内的清华源进行安装)

    注 安装tensorflow numpy这些源 记得用国内的清华镜像源 国外的源由于网络延迟无法安装 1 国内安装tensorflow的命令 pip install index url https pypi douban com simpl
  • 法拉克机器人自动怎么调_发那科机器人的简单设置你知道吗

    发那科机器人使用后台逻辑时 可以在后台执行只包含对应后台逻辑指令的TP程序 程序从 初到 后被反复执行 该执行不受急停 暂停 报警的影响 设定后台逻辑的步骤非常简单 1 按下MENU键 2 选择SETUP 3 选择BG LOGIC 进入如下
  • 洛谷P5731——蛇形方阵(c++)

    题目描述 给出一个不大于 9 的正整数 n 输出 n n 的蛇形方阵 从左上角填上 1 开始 顺时针方向依次填入数字 如同样例所示 注意每个数字有都会占用 3 个字符 前面使用空格补齐 输入格式 输入一个正整数 n 含义如题所述 输出格式
  • Qt 设置窗口的背景图片

    Qt 设置窗口的背景图片 一 给Qt窗口设置背景图片 mainwindow cpp 设置背景图片 path 图片路径 void MainWindow setBackgroundImage QString path QPixmap pixma
  • 零基础学习Vue: 第38课 Vue单页面使用router-link实现页面跳转小案例:

    零基础学习Vue 第38课 Vue单页面使用router link实现页面跳转小案例 实现效果如下 以下是所有代码
  • Ubuntu操作遇到的报错解决方法汇总(持续更新)

    1 在anaconda中创建了虚拟环境并安装了pytorch 但是编译过程中仍然报没有torch的错误 CMake Error at crawler crane crane tutorials CMakeLists txt 23 find
  • Form表单提交数据的几种方式

    1 submit提交 在form标签中添加Action 提交的地址 和method post 且有一个submit按钮
  • conda安装OpenCV

    安装参考 错误方法conda install channel https conda anaconda org menpo opencv3 C Users 15761 gt conda install channel https conda
  • Cplex求解QCP非线性规划

    import ilog concert import ilog cplex public class QCPex1 public static void main String args try IloCplex cplex new Ilo
  • Environment variable CLASSPATH not set!

    hdfs 问题 Environment variable CLASSPATH not set getJNIEnv getGlobalJNIEnv failed WARNING Logging before InitGoogleLogging
  • is not eligible for getting processed by all BeanPostProcessors

    BeanPostProcessor是控制Bean初始化开始和初始化结束的接口 换句话说实现BeanPostProcessor的bean会在其他bean初始化之前完成 BeanPostProcessor会通过接口方法检查其他类型的Bean并做
  • Visio 2013绘制时序图

    为什么要绘制时序图 我们编码的时候 知道有的用例的业务逻辑按照比较确定的时间先后顺序进行展开 这时候 我们就需要知道我们设计的系统中的不同类之间传递消息 可以认为是不同对象函数间的调用 要按照怎么样的顺序 传递什么消息 返回什么消息 这时候
  • Altium designer 原理图转换为pcb时出现的 unknown pin 和 failed to add class member

    网上有很多方法 大部分都是让直接新建一个pcb文件 这显然太不现实了 上述错误可以看出 unknown pin 的错误是在add pin to net的时候发生的 failed to add class member 的错误实在add to
  • 开源库TinyXML2简介及使用

    TinyXML2是一个开源 简单 小巧 高效的C XML解析器 它只有一个 h文件和一个 cpp文件组成 可以轻松集成到其它程序中 它解析XML文档并从中构建可以读取 修改和保存的文档对象模型 Document Object Model D