一、XML介绍
当我们想要在不同的程序、系统或平台之间共享信息时,就需要一种统一的方式来组织和表示数据。XML(EXtensible Markup Language,即可扩展标记语言)是一种用于描述数据的标记语言,它让数据以一种结构化的方式呈现,使得计算机程序能够轻松理解和处理这些数据。
XML有以下特点:
- 可扩展性:XML 标记集合不是固定的,可以根据需要进行扩展。它允许用户自定义标记,因此可以根据需要创建自定义的数据结构和标记集合,使其适应各种不同的应用场景。
- 自我描述性:XML 文档包含标签(元素)和属性,这些标签和属性的名称通常反映了其所包含数据的含义。因此,XML 文档本身提供了关于数据结构和含义的信息。服务器托管网
- 结构化:XML 使用标记来标识数据,并通过元素之间的嵌套关系来表示数据的结构,使其更易于理解和处理。
- 跨平台性:XML是一种独立于平台和编程语言的标记语言,可以在各种不同的操作系统和软件环境中使用,并且能够轻松地与网络上的其他系统进行数据交换。
- 数据分离:XML将数据与其格式和结构分离开来,使得数据和显示方式之间有了清晰的分界,这有助于更灵活地管理和维护数据。
- 通用性:XML 广泛应用于各种领域,例如数据交换、配置文件、Web服务等,因其通用性而受到广泛支持和应用。
二、XML的解析
常见的XML解析方式有以下几种:
- DOM 解析:DOM(Document Object Model,文档对象模型)解析器会将整个 XML 文档加载到内存中,并将其表示为一个树形结构,开发者可以通过遍历树节点来访问和操作 XML 元素和属性。
- SAX 解析:SAX(Simple API for XML)解析器是一种基于事件驱动的解析方式,它顺序读取 XML 文档,当遇到 XML 元素、文本或其他事件时,会触发相应的回调函数,开发者可以在回调函数中处理这些事件。
- XPath:XPath 是一种用于在 XML 文档中定位节点的语言,可以通过路径表达式来指定节点的位置和关系,从而实现对 XML 数据的精确访问和提取。
- XSLT:可扩展样式表语言转换(EXtensible Stylesheet Language Transformations)是一种基于 XML 的语言,用于对 XML 数据进行转换和处理。可以将XML数据档转换为另外的XML或其它格式,如HTML网页,纯文字等。
- 第三方库和工具:除了语言内置的解析库外,还有许多第三方库和工具可用于解析 XML 文件,如 lxml(Python)、Jsoup(Java)、XmlReader(C#)等。
三、TinyXML-2简介
TinyXML-2 是一个简单、小型、高效的 C++ XML 解析器,可被轻易地集成到其他程序中。它使用文档对象模型(DOM)的方式解析XML,可使用它解析 XML 文档,并读取、修改和保存的文档对象模型。
使用TinyXML-2可以实现对XML文件的:创建、解析、修改等功能。
该项目的GitHub链接如下:
TinyXML-2 【github项目】
也可以从此处下载TinyXML2源码(免费,不需要积分):
【免费】XML解析工具-TinyXML2-源代码-C++资源-CSDN文库
四、XML解析示例
4.1 创建测试用的XML文件
创建testXML.xml,内容如下所示:
null
windows7 c
windows7 c++
windows7 java
windows7 python
windows10 c
windows10 c++
windows10 java
windows10 python
windows11 c
windows11 c++
windows11 java
windows11 python
ubuntu_c
ubuntu_c++
ubuntu_java
ubuntu_python
centos_c
centos_c++
centos_java
centos_python
注:
– 根元素为 system ,其中包含 android、windows、linux三个操作系统大类。
– 每个操作系统大类下又包含具体的操作系统版本,如windows包含windows7、windows10、windows11等。
– 对每一个具体的操作系统版本,包含了用以存储若干app的apps 。
– 每个应用存储到具体的某个app中。
4.2 拷贝TinyXML-2项目的代码
将TinyXML-2项目中的 tinyxml2.cpp、tinyxml2.h 两个文件拷贝到当前的工作目录。
4.3 编写XML解析的测试代码
本次以读取并输出 “某类操作系统” 中的 “各个具体操作系统版本” 的 “app内容” 为例:
创建readxml.cpp并编辑,该文件内容如下:
#include
#include
#include "tinyxml2.h"
using namespace tinyxml2;
using namespace std;
//定义结构体OS_APPS以进行数据存储
typedef struct os_apps{
string osname;
vector apps;
} OS_APPS;
//输出容器中的所有信息
void show(vector &v)
{
cout &v, const char* target_os)
{
// 获取根元素
XMLElement* root = doc->RootElement();
if (!root) {
std::cout FirstChildElement(target_os);
if (!os_element)
{
// 未找到指定元素
cout FirstChildElement();
if(!sub_os_element)
{
cout s;
//获取子操作系统的名称
oa.osname = s服务器托管网ub_os_element -> Value();
//获取存储apps列表的节点
XMLElement* apps_element = sub_os_element -> FirstChildElement();
if(!apps_element)
{
cout FirstChildElement();
while(app_element)
{
s.push_back(app_element -> GetText());
app_element = app_element -> NextSiblingElement();
}
//存储
oa.apps = s;
v.push_back(oa);
//继续处理同级的其他子OS
sub_os_element = sub_os_element -> NextSiblingElement();
}
}
int main( int argc, const char ** argv)
{
//读取的数据将存放在容器v中
vector v;
//参数校验
if(argc == 1)
{
cout LoadFile( argv[1] );
if (doc->ErrorID() != XML_SUCCESS)
{
cout
4.4 生成可执行程序
在命令行执行以下命令:
g++ -g -c tinyxml2.cpp -o tinyxml2.o
g++ -g -c readxml.cpp -o readxml.o
g++ -g -o read_xml_test tinyxml2.o readxml.o
4.5 执行程序
执行程序:
./read_xml_test testXML.xml
执行结果如下所示:
可以看到,XML中的文件已经被成功读取。
五、示例代码下载
这里是以上测试代码文件(为了方便测试,补充了makefile文件和shell脚本)。
run_test.sh shell文件,清理当前目录,重新执行make命令,并运行代码
Makefile makefile文件,编译并链接项目
readxml.cpp XML解析测试源文件
tinyxml2.cppTinyXML-2 源文件
tinyxml2.h TinyXML-2头文件testXML.xml 测试用xml文件
执行结果如下:
下载链接:
【免费】XML解析示例项目-读取并输出xml的指定内容示例资源-CSDN文库
六、函数的参数及功能
在tinyxml2.h 中,给出了函数的定义,功能及参数类型,可根据需求寻找与使用相应的函数。
如有不当或错误之处,恳请您的指正,谢谢!!!
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net