一、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文件语法、格式是否正确。