C++使用XML和TinyXML2

本文介绍了XML的基础概念,如结构、语法和TinyXML2库的使用,展示了如何用C++通过TinyXML2解析XML文件并进行操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、XML简介:

1.1 XML的定义:

XML是 Extensible Markup Language 的缩写,即“可扩展标记语言”,可用于数据或数据结构在不同编程语言环境下的共享。

随着 json、protobuf等协议的推出和发展,目前XML大多用于本地化场景

主要是由于XML相对于json格式,数据冗余度大,更大的体积意味着相较于json会占用更多的网络带宽,且XML的解析速度也比不上json、protobuf等协议。

1.2 XML文档的组成:

XML文档也属于纯文本文件,一般由如下四部分组成:
(1)XML文档的声明;
(2)XML文档类型定义;
(3)XML文档注释(格式:以<!--开始,以-->结尾:<!-- This is a comment -->);
(4)XML标识及其内容(主体)。

<?xml version="1.0" encoding="UTF-8"?>		<!-- XML声明:定义XML的版本(1.0)和 所使用编码(UTF-8) -->
<UserGroup>									<!-- 根元素 -->				
	<User Name="Obama" Password="1234">		<!-- 子元素 -->
		<Gender>man</Gender>				<!-- 子元素 -->
		<Age>61</Age>
		<Mobile>10000</Mobile>
		<Email>1234@qq.com</Email>
	</User>

	<User Name="Trump" Password="5678">
		<Gender>man</Gender>
		<Age>62</Age>
		<Mobile>20000</Mobile>
		<Email>5678@qq.com</Email>
	</User>
</UserGroup>								<!-- 根元素的结尾 -->

1.3 XML的基本语法:

1.3.1 XML的语法规则:

一般XML的语法规则大致可归纳为以下几点:
(1)结束标记不可忽略;
(2)区分大小写;
(3)正确的嵌套包含。

1.3.2 元素:

XML元素指的是从(且包括) 开始标签 直到(且包括) 结束标签 的部分。

元素可包含其他元素、文本 或者两者的混合物。元素也可以拥有属性。

如上例中,每一项称为XML的一个 “元素”,例如

	<Gender>man</Gender>

是一个元素,<Gender> 是元素名,man 是元素Gender的值。

根元素:
XML文档中的第一个元素被称为“根元素”,在任何一个XML文档中有且只有一个元素被称为根元素,其余所有的元素都是“子元素”,子元素必须正确的嵌套在根元素中。

标记间的字符串数据就是该元素的值,在XML中,如果元素的值中存在空格,那么这些空格将按原样解析出来。

1.3.3 属性:

属性是用来修饰某个元素的。属性通常用于提供不属于数据组成部分的额外信息。

例如:

<file type="gif">computer.gif</file>

在本例中,文件类型与数据本身无关,但是对于需要处理这个元素的软件来说却非常重要。

其中,type称为“属性名”,"gif"称为“属性值”

关于 元素属性 需要注意如下几个问题:
(1)属性的值必须使用 双引号 括起来;
(2)元素的属性以 名和值 成对出现;
(3)用来修饰同一个元素的属性的属性名不能相同;
(4)属性值 不能包含 “&”、 “<” 等字符

1.3.4 XML树结构:

XML文档形成一种树结构,这棵树从根部开始,并扩展到树的最底端。

其中必须包含 根元素,该元素是其他所有元素的父元素,所有元素均可拥有子元素,且所有元素均可拥有 文本内容和属性。

<??>
<root>
	<child>
		<subchild>...</subchild>
	</child>
	<child property="value">
		<subchild>...</subchild>
	</child>
</root>

二、TinyXML2库使用方法:

2.1 TinyXML2简介:

TinyXML2是简单实用的开源C++ XML文件解析库,可以很方便的应用到现有的项目之中。

由于XML的树状结构,TinyXML2将XML的节点抽象为 XMLNode,XML中除了把属性 key-value 抽象为 XMLAttribute 类型外,其余的都看作 XMLNode的子类,首先将整个XML文档抽象为 XMLDocument,将声明部分抽象为 XMLDeclaration,将注释抽象为 XMLComment,将元素抽象为 XMLElement,将文本抽象为 XMLText。

在这里插入图片描述

2.2 TinyXML2安装:

下载地址:
https://github.com/leethomason/tinyxml2

cd tinyxml2/
make
./xmltest		//测试该版本的准确性
sudo make install

可以看到安装的路径:

sh-3.2# ./xmltest
Pass 463, Fail 0
sh-3.2# sudo make install
mkdir -p /usr/local
mkdir -p /usr/local/bin
mkdir -p /usr/local/lib
mkdir -p /usr/local/include
install xmltest /usr/local/bin/xmltest
install -m 644 tinyxml2.h /usr/local/include/tinyxml2.h
install -m 644 libtinyxml2.a /usr/local/lib/libtinyxml2.a

2.3 TinyXML2使用示例:

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

int main(void)
{
    tinyxml2::XMLDocument doc;

    // 本地文件读取
    tinyxml2::XMLError ret = doc.LoadFile("local_xml.xml");

    std::cout << doc.ErrorID() << std::endl;
    std::cout << ret << std::endl;

    //  加载到内存
    tinyxml2::XMLPrinter printer;
    doc.Print(&printer); // 打印到内存
    std::cout << printer.CStr() << std::endl;

    std::cout << "size: " << printer.CStrSize() << std::endl;
    std::cout << "size: " << strlen(printer.CStr()) + 1 << std::endl;

    return 0;
}

三、工具:

XML在线格式化工具:
https://tool.oschina.net/codeformat/xml/
可用于检测XML文件语法、格式是否正确。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值