C++解析XML文件

article/2025/9/27 22:22:45

新的一周又来啦,这周我要分享的是使用C++库解析XML文件和JSON文件,在本篇博客中我主要讲解析XML文件的相关知识,在下篇博客讲述有关解析JSON文件的相关。在解析XML文件时我使用的解析库是tinyXML2,编译平台是VS2019。希望看完本篇博客能对你有所帮助。

XML文件简介

在学习解析XML文件之前我们应该先了解什么是XML文件。

XML文件是什么?

XML 指可扩展标记语言(eXtensible Markup Language),设计用来传输和存储数据。

  1. XML的设计宗旨是传输数据,而不是显示数据。
  2. XML 标签没有被预定义。您需要自行定义标签。
  3. XML 被设计为具有自我描述性。

XML的用途:

  • XML 把数据从 HTML 分离
  • XML 简化数据共享
  • XML 简化数据传输
  • XML 简化平台变更
  • XML 使您的数据更有用
  • XML 用于创建新的互联网语言

XML文件语法

XML文件的语法规则很简单主要包括以下几点:

  1. XML 文档必须有根元素

XML 必须包含根元素,它是所有其他元素的父元素,如以下实例中 root 就是根元素:

<root><child><subchild>.....</subchild></child>
</root>
  1. XML 声明

XML 声明文件的可选部分,如果存在需要放在文档的第一行,如下所示:

<?xml version="1.0" encoding="utf-8"?>
  1. 所有的 XML 元素都必须有一个关闭标签,但声明可以没有关闭标签
<p>This is a paragraph.</p>
  1. XML 标签对大小写敏感

XML 标签对大小写敏感。标签 与标签 是不同的。必须使用相同的大小写来编写打开标签和关闭标签:

Message>这是错误的</message>
<message>这是正确的</message>
  1. XML 必须正确嵌套
<b><i>This text is bold and italic</i></b>
  1. XML 属性值必须加引号
<note date=12/11/2007>
<to>Tove</to>
<from>Jani</from>
</note>
<note date="12/11/2007">
<to>Tove</to>
<from>Jani</from>
</note>

在上面两个XML文档中,第一个是错误的,第二个是正确的。

您如需了解更多关于XML文件的相关信息,可以到菜鸟教程学习相关知识。
在上面我介绍XML文件相关知识也都参考了该网站,有关知识介绍的都很全。

TinyXML2库及配置

在了解完XML文件的相关知识后,我们就可以开始进行XML文件的解析工作了。我们可以利用现成开源的库来帮助我们解析XML文件,目前比较好用的库就是TinyXML2,只有两个文件分别是.h文件和.cpp文件。TinyXML2相关的库可以再网上很容易下到,也可以到我的github下载相关的库文件,网址如下:TinyXML2文件库下载
这个库里面也有两个相关的例子。
把库下好之后,就可以进行配置了,TinyXML2配置相比于JSONCPP容易很多,就只有两步:

  1. 把库文件导入到项目工程中。如图所示:
    在这里插入图片描述
    2.在代码头文件中引入头文件和命名空间
#include "tinyxml2.h"
using namespace tinyxml2;

在这里插入图片描述

创建XML文件

配置好库之后就可以依赖库创建XML文件了,先贴代码:

void  createCodeXml()
{XMLDocument xml;//插入声明XMLDeclaration* declaration = xml.NewDeclaration();xml.InsertFirstChild(declaration);//插入根节点XMLElement* rootNode = xml.NewElement("wang");xml.InsertEndChild(rootNode);//新建一个name节点XMLElement* root_1_name = xml.NewElement("name");//新建name节点的文本wangqinghe//XMLText* text_1_name = xml.NewText("wangqinghe");把文本与name节点链接起来//root_1_name->InsertFirstChild(text_1_name);//新建一个age节点XMLElement* root_1_age = xml.NewElement("age");XMLText* text_1_age = xml.NewText("18");root_1_age->SetAttribute("age", "secret");root_1_age->InsertFirstChild(text_1_age);//创建name节点的子节点XMLElement* root_2_gender = xml.NewElement("gender");XMLText* text_2_gender = xml.NewText("man");root_2_gender->InsertFirstChild(text_2_gender);//将gender节点变为name节点的子节点root_1_name->InsertEndChild(root_2_gender);//链接name节点与根节点rootNode->InsertEndChild(root_1_name);rootNode->InsertEndChild(root_1_age);xml.SaveFile("wang.xml");
}

首先构造一个XML文档:

XMLDocument xml;

插入声明:

//插入声明XMLDeclaration* declaration = xml.NewDeclaration();xml.InsertFirstChild(declaration);

插入声明后先插入一个根节点:“wang”

//插入根节点XMLElement* rootNode = xml.NewElement("wang");xml.InsertEndChild(rootNode);

新建一个name节点:

XMLElement* root_1_name = xml.NewElement("name");

创建name节点的子节点“gender”,文本内容为“man”,此时两者还没关系。

XMLElement* root_2_gender = xml.NewElement("gender");XMLText* text_2_gender = xml.NewText("man");root_2_gender->InsertFirstChild(text_2_gender);

把节点“gender”设置为节点“name”的子节点

root_1_name->InsertEndChild(root_2_gender);

新建一个age 节点,文本内容为18:

XMLElement* root_1_age = xml.NewElement("age");
XMLText* text_1_age = xml.NewText("18");
root_1_age->SetAttribute("age", "secret");
root_1_age->InsertFirstChild(text_1_age);

把name节点和age节点设置为根节点的子节点,到此所有的节点都连接完毕:

rootNode->InsertEndChild(root_1_name);
rootNode->InsertEndChild(root_1_age);

最后保存文件,文件名为wang.xml:

xml.SaveFile("wang.xml");

至此就已经创建好一个简单的xml文件了,文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<wang><name><gender>man</gender></name><age age="secret">18</age>
</wang>

xml文件创建完毕。

解析XML文件

创建完XML文件之后,我们就可以根据XML的文件格式来解析对应的XML文件。先放代码:

void decodeXml()
{//声明XMLDocument xml;//导入xml文件if (xml.LoadFile("wang.xml") != XML_SUCCESS){return;}//判断头文件是否为空XMLElement* rootNode = xml.RootElement();if (rootNode == NULL){return;}//读取第一层信息XMLElement* root_1_name = rootNode->FirstChildElement("name");//读取第二层信息XMLElement* root_2_gender = root_1_name->FirstChildElement("gender");//信息输出string text_gender = root_2_gender->GetText();cout << "gender: "<<text_gender << endl;//读取第一层信息XMLElement* root_1_age = rootNode->FirstChildElement("age");const XMLAttribute* att_1_age = root_1_age->FirstAttribute();cout << att_1_age->Name() << ":" << att_1_age->Value() << endl;string text_age = root_1_age->GetText();cout << "age: " << text_age << endl;
}

读取信息的代码比较简单,通过注释应该能轻易理解,读取的文件就是我们上面生成的XML文件。
总的代码如下:

#include <iostream>  
#include"tinyxml2.h"  
using namespace std;
using namespace tinyxml2;
void example2()
{XMLDocument doc;doc.LoadFile("test.xml");XMLElement* scene = doc.RootElement();XMLElement* surface = scene->FirstChildElement("node");while (surface){XMLElement* surfaceChild = surface->FirstChildElement();const char* content;const XMLAttribute* attributeOfSurface = surface->FirstAttribute();cout << attributeOfSurface->Name() << ":" << attributeOfSurface->Value() << endl;while (surfaceChild){content = surfaceChild->GetText();surfaceChild = surfaceChild->NextSiblingElement();cout << content << endl;}surface = surface->NextSiblingElement();}
}
int main()
{example2();return 0;
}

另一种解析XML文件的代码:
首先是要解析的文件:

<?xml version="1.0" encoding="UTF-8"?>
<scene name="Depth"><node type="camera"><eye>0 10 10</eye><front>0 0 -1</front><refUp>0 1 0</refUp><fov>90</fov></node><node type="Sphere"><center>0 10 -10</center><radius>10</radius></node><node type="Plane"><direction>0 10 -10</direction><distance>10</distance></node>
</scene>

对应代码:

#include <iostream>  
#include"tinyxml2.h"  
using namespace std;
using namespace tinyxml2;
void example2()
{XMLDocument doc;doc.LoadFile("test.xml");XMLElement* scene = doc.RootElement();XMLElement* surface = scene->FirstChildElement("node");while (surface){XMLElement* surfaceChild = surface->FirstChildElement();const char* content;const XMLAttribute* attributeOfSurface = surface->FirstAttribute();cout << attributeOfSurface->Name() << ":" << attributeOfSurface->Value() << endl;while (surfaceChild){content = surfaceChild->GetText();surfaceChild = surfaceChild->NextSiblingElement();cout << content << endl;}surface = surface->NextSiblingElement();}
}
int main()
{example2();return 0;
}

代码下载:
相关的代码下载


http://chatgpt.dhexx.cn/article/1hlA1eq6.shtml

相关文章

解析XML的几种方式

XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便。对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM(Document Object Model),DTD(Document Type Definition),SAX(Simple API fo…

C# 读取XML文件的几种方式

在开发过程中&#xff0c;我们有时会需要保存到本地一些结构化数据或者配置信息&#xff0c;这时就可以选择用xml文件。当然xml的用途也不仅仅是这些。 这一篇来谈一谈关于读取xml文件的几种方式&#xff1b; 我们有以下两个文件&#xff0c;一个是带有id属性的&#xff0c;一个…

Android解析XML的三种方式

在Android中提供了三种解析XML的方式:DOM(Document Objrect Model),SAX(Simple API XML),以及Android推荐的Pull解析方式. 如图: 本篇博客使用的xml文件如下:(这里是获取网络XML)person.xml <?xml version="1.0" encoding="UTF-8"?> <pers…

XML解析之SAX方式

XML文件解析方式之一是SAX方式&#xff0c;SAX解析方式会逐行地去扫描XML文档&#xff0c;当遇到标签时会触发解析处理器&#xff0c;采用事件处理的方式解析XML (Simple API for XML) 。SAX是一个用于处理XML事件驱动的“推”模型&#xff0c;虽然不是官方标准&#xff0c;但它…

实现XML解析的几种技术

XML在各种开发中都广泛应用&#xff0c;Android也不例外。作为承载数据的一个重要角色&#xff0c;如何读写XML成为Android开发中一项重要的技能。今天就由我向大家介绍一下在Android平台下几种常见的XML解析和创建的方法。 在Android中&#xff0c;常见的XML解析器分别为SAX解…

MATLAB中的均值与方差求法(mean,var,std函数使用)

目录 均值-mean()函数的用法方差var函数std函数 均值-mean()函数的用法 对于矩阵A&#xff1a; &#xff08;1&#xff09;mean(A,1)为对矩阵A的列求均值 &#xff08;2&#xff09;mean(A,2)为对矩阵A的行求均值 &#xff08;3&#xff09;mean(A)当传入的参数只有矩阵时&a…

matlab怎么方差函数,密度函数已知,怎么用matlab求其数学期望和方差?

在没有先验知识的情况下是不可能的&#xff0c;在你已知它可能是哪种分布(或者哪些种分布之一)的情况下可以求出分布的参数www.mh456.com防采集。 因为你的是密度函2113数&#xff0c;所以不会5261是离散型随机变量&#xff0c;如果你有4102概率密度函数的表达式的话&#xff0…

matlab怎么算方差和标准差,matlab怎么求矩阵的均值和标准差 看完你就知道了

有时候我们在使用matlab编程计算的时候&#xff0c;想求矩阵的均值和方差&#xff0c;怎么求呢&#xff0c;下面来分享一下方法 工具/材料 matlab 求矩阵的均值和标准差方法 matlab求矩阵均值方法 01 第一步打开matlab命令行窗口&#xff0c;新建一个a[1 2 3;4 5 6;7 8 9]矩阵&…

剩余方差matlab,用matlab的var函数求方差

什么是方差和标准差&#xff1f; 方差(variance) 和标准差(standard variance) 方差&#xff1a;表示一组离散数据偏离平均值的程度。 公式&#xff1a; 方差公式 方差的算术平方根称为该随机变量的标准差。 在Matlab中&#xff0c;方差用var函数求&#xff0c;标准差用std函数…

matlab里方差分析的盒子图怎么看,Matlab方差分析

Matlab 方差分析(T检验) 在工农业生产和科学研究中,经常遇到这样的问题:影响产品产量、质量的因素很多,我们需要了解在这众多的因素中,哪些因素对影响产品产量、质量有显著影响.为此,要先做试验,然后对测试的结果进行分析.方差分析就是分析测试结果的一种方法.在方差分析中,把在…

20171205_Matlab求方差,均值,均方差,协方差的函数

1、 均值 数学定义&#xff1a; Matlab函数&#xff1a;mean >>X[1,2,3] >>mean(X)2 如果X是一个矩阵&#xff0c;则其均值是一个向量组。mean(X,1)为列向量的均值&#xff0c;mean(X,2)为行向量的均值。 >>X[12 3 45 6] >>mean(X,1)[2.5,3.5, 4.5] &g…

方差分析MATLAB实现

单因素方差分析的MATLAB实现 单因素均衡数据的实现 单因素非均衡数据方差分析 p192 8.22 X[85,80,90,88,87,94,56,62,55,48,92,99,95,91,75,72,81];group[ones(1,3),2*ones(1,4),3*ones(1,2),4*ones(1,2),5*ones(1,4),6*ones(1,3)];anova1(X,group); 从箱线图可以看到第2个第五…

matlab算方差std,MATLAB 方差函数 var std

1、均值 数学定义: Matlab函数:mean >>X=[1,2,3] >>mean(X)=2 如果X是一个矩阵,则其均值是一个向量组。mean(X,1)为列向量的均值,mean(X,2)为行向量的均值。 >>X=[1 2 3 4 5 6] >>mean(X,1)=[2.5, 3.5, 4.5] >>mean(X,2)=[2 5] 若要求整个矩…

matlab 方差,方差分解——matlab 代码

封面图片源自网络: 接着前面两期分析,今天介绍期限结构和收益率的方差分解代码: function var_plot= var_term( Phi_DRAW,OMIGA_ff_DRAW,HH) %%%% HH means the step length for forecast %%%%%%%%%% %%%%%% get the forecast variance decomposition %%%%%%% %%% SIGMA_u=P…

matlab u怎么求均方差,Matlab求方差,均值,均方差,協方差的函數

1、均值 數學定義&#xff1a; Matlab函數&#xff1a;mean >>X[1,2,3] >>mean(X)2 如果X是一個矩陣&#xff0c;則其均值是一個向量組。mean(X,1)為列向量的均值&#xff0c;mean(X,2)為行向量的均值。 >>X[1 2 3 4 5 6] >>mean(X,1)[2.5, 3.5, 4.5]…

Matlab系列教程_数值计算_求方差和标准差

首先&#xff0c;什么是方差和标准差&#xff1f; 方差&#xff0c;是在概率论和统计方差衡量随机变量或一组数据时离散程度的度量&#xff0c;统计中的方差&#xff08;样本方差&#xff09;是每个样本值与全体样本值的平均数之差的平方值的平均数。在许多实际问题中&#xff…

MATLAB中均值、方差、均方差的计算方法

1、 均值 数学定义&#xff1a; &#xff08;自己搜一下&#xff09; Matlab函数&#xff1a;mean >>X[1,2,3] >>mean(X)2 如果X是一个矩阵&#xff0c;则其均值是一个向量组。mean(X,1)为列向量的均值&#xff0c;mean(X,2)为行向量的均值。 >>X[1 2 3 4 5 …

利用MATLAB求均值、方差和标准差

1、 均值 数学定义&#xff1a; Matlab函数&#xff1a;mean 如果X是一个矩阵&#xff0c;则其均值是一个向量组。mean(X,1)为列向量的均值&#xff0c;mean(X,2)为行向量的均值。若要求整个矩阵的均值&#xff0c;则为mean(mean(X))或者mean2(X)。 2、 方差 数学定义&…

matlab 方差计算

代码如下&#xff1a; I imread(); dark_Idouble(I)/255; avgmean2(dark_I); %求图像均值 [m,n]size(dark_I); s0; for x1:mfor y1:nss(dark_I(x,y)-avg)^2; %求得所有像素与均值的平方和。end end%求图像的方差 a1var(dark_I(:)); %第一种方法&#xff1a;利用函数var求得…

环形队列的实现

首先我们先来了解一下队列是什么&#xff1f; 队列&#xff1a;数据先入先出&#xff0c;后进后出&#xff08;与栈刚好相反&#xff09;&#xff0c;主要通过数组实现。需要通过两个指针来创建对应的队列&#xff1b;一个指针为前缀pre&#xff0c;一个指针为后缀rear。pre指…