📋 前言
- 🖱 博客主页:在下马农的碎碎念
- 🤗 欢迎关注🔎点赞👍收藏⭐️留言📝
- ✍ 本文由在下马农原创,首发于CSDN
- 📆 首发时间:2021/12/25
- 📅 最近更新时间:2021/12/25
- 🤵 此马非凡马,房星本是星。向前敲瘦骨,犹自带铜声。
- 📇 系列文章目录: 快点我呀,我是目录
- 🙏作者水平有限,如发现错误,请留言轰炸哦!万分感谢!
仍然自由由我,永远高唱我歌
一、tinyxml2概述
TinyXML-2是一个用于解析和生成XML文档的轻量级C++库,它提供了一组简单的类和函数来处理 XML 数据。它是TinyXML的升级版本,旨在提供更好的性能和更多功能。
以下是TinyXML-2的一些特点和功能:
-
轻量级:TinyXML-2的设计目标是简单、紧凑和高效。它的代码库非常小巧,适用于嵌入式系统或资源有限的环境。
-
解析XML:TinyXML-2可以解析XML文档并构建相应的内部数据结构。它支持基本的XML语法,包括元素、属性、文本和注释等。
-
生成XML:除了解析XML,TinyXML-2还可以生成XML文档。它允许用户创建元素、属性和文本,并将它们组合成完整的XML文档。
-
错误处理:TinyXML-2提供了强大的错误处理机制。在解析或生成XML时,如果遇到任何错误,它会生成相应的错误消息,以便开发人员可以轻松地调试和修复问题。
-
支持XPath查询:TinyXML-2支持使用XPath表达式对XML文档进行查询。XPath是一种用于在XML文档中定位节点的语言,它提供了强大的查找和过滤功能。
-
Unicode支持:TinyXML-2内置了对Unicode字符集的支持。它可以正确处理各种语言的文本,包括非ASCII字符。
-
跨平台:TinyXML-2可以在多个操作系统上运行,包括Windows、Linux和Mac OS X等。它使用标准的C++代码编写,不依赖于特定的操作系统功能。
-
开源许可:TinyXML-2是基于MIT许可证发布的开源软件。这意味着用户可以免费使用、修改和分发这个库的源代码。
总体而言,TinyXML-2是一个简单而强大的C++库,用于处理XML文档。它提供了解析和生成XML的功能,支持错误处理和XPath查询,并具有跨平台和Unicode支持等特性。无论是嵌入式系统还是桌面应用程序,TinyXML-2都是一个方便易用的选择。
二、tinyxml2对象
tinyxml2
中主要涉及五个对象,分别为:
1. XMLDocument:
XMLDocument 是 TinyXML2 的核心对象,用于表示整个 XML 文档。它可以用于解析 XML 文件或从头开始创建新的 XML 文档。
2. XMLElement:
XMLElement 表示 XML 文档中的元素。每个元素可以包含其他元素、属性和文本内容。XMLElement 对象提供了方法来获取和修改元素的名称、属性和内容。
3. XMLAttribute:
XMLAttribute 用于表示 XML 元素的属性。每个属性由名称和值组成,可以通过 XMLElement 对象的方法来访问和修改属性。
4. XMLText:
XMLText 用于表示 XML 元素中的文本内容。它可以包含文本节点中的实际文本数据,可以通过 XMLElement 对象的方法来获取和修改文本内容。
5. XMLComment:
XMLComment 用于表示 XML 中的注释。它可以包含注释节点中的实际注释内容,可以通过 XMLElement 对象的方法来获取和修改注释内容。
学会这几个对象的使用,我们就可以随心所欲地使用tinyxml2来操作xml文件
三、tinyxml2使用方法
tinyxml2
使用方式非常简单,只需要将tinyxml2.cpp
和tinyxml.h
拷贝到项目目录,并在使用到tinyxml的文件中包含tinyxml.h头文件以及引入命名空间即可。不需要编译即可直接使用。
#include "tinyxml2.h"
using namespace tinyxml2;
四、tinyxml接口详解
4.1 创建xml文档
使用tinyxml中的XMLDocument对象可以实现xml文件的创建。
注意:本章节所有代码可在博主github获取,链接如下: ==tinyxml2使用==
如果不能访问,直接私信博主即可获取。
接口介绍
-
创建新的Declaration对象
NewDeclaration()
-
将新的子元素添加到调用此接口的XML元素的末尾
InsertEndChild()
-
创建新的Elements元素对象
NewElement()
-
保存文档到文件,在对xml文档做出修改之后,调用此方法保存方法。 `
XMLDocument::SaveFile()
示例介绍
在下面的示例程序中,我们首先创建一个XMLDocument对象doc。之后创建一个XML的声明并将其插入到doc的末尾,之后有创建一个根元素名为Root,并将此元素也插入到文档对象doc末尾。最后创建一个元素名为Child,将其添加在根元素Root的末尾。最后保存文件到example.xml。
示例代码:
#include "tinyxml2.h"
int main() {
// 创建XML文档对象
tinyxml2::XMLDocument doc;
// 创建XML声明
tinyxml2::XMLDeclaration* declaration = doc.NewDeclaration();
doc.InsertEndChild(declaration);
// 创建根元素
tinyxml2::XMLElement* root = doc.NewElement("Root");
doc.InsertEndChild(root);
// 创建子元素并添加到根元素中
tinyxml2::XMLElement* child = doc.NewElement("Child");
child->SetText("Hello, World!");
root->InsertEndChild(child);
// 保存XML文档到文件
doc.SaveFile("example.xml");
return 0;
}
编译之后执行生成的可执行程序,会在执行程序的地方生成一个xml文件,名字是examole.xml
4.2 删除xml文档
接口介绍
- 加载xml文件,加载成功返回0
LoadFile()
示例代码
#include <iostream>
#include "tinyxml2.h"
int main() {
const char* filename = "example.xml";
// 创建一个 XML 文档对象
tinyxml2::XMLDocument doc;
// 加载 XML 文件
tinyxml2::XMLError result = doc.LoadFile(filename);
if (result == tinyxml2::XML_SUCCESS) {
// 删除 XML 文件
std::remove(filename);
std::cout << "XML 文件删除成功。" << std::endl;
} else {
std::cout << "无法加载 XML 文件:" << result << std::endl;
}
return 0;
}
4.3 打印xml文档
当我们获取到某个特定的元素之后,我们可以使用tinyxml2提供的接口将其打印出来。
接口介绍
- 将给定的XML对象打印到XMLPrinter中,支持打印XMLDocument、XMLElement和XMLText等节点。
XMLDocument::Print()
示例代码
#include <iostream>
#include "tinyxml2.h"
int main() {
tinyxml2::XMLDocument doc;
doc.LoadFile("example.xml"); // 加载XML文档
tinyxml2::XMLPrinter printer;
doc.Print(&printer); // 使用Printer打印XML文档
std::cout << printer.CStr() << std::endl; // 输出打印结果
return 0;
}
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<Child>Hello, World!</Child>
</Root>
运行结果:
4.4 创建节点
接口介绍
- 使用NewElement创建新的元素节点:
tinyxml2::XMLElement* element = doc.NewElement("ElementName");
- 使用NewText创建一个包含文本内容的文本节点:
tinyxml2::XMLText* textNode = doc.NewText("TextContent");
- 使用NewComment 创建注释节点
tinyxml2::XMLComment* comment = doc.NewComment("This is a comment");
- 使用NewDeclaration创建一个声明节点:
tinyxml2::XMLDeclaration* declaration = doc.NewDeclaration();
- 使用NewDocument创建一个新的XML文档节点:
tinyxml2::XMLDocument* newDocument = new tinyxml2::XMLDocument();
- 使用InsertFirstChild将一个节点作为父节点的第一个子节点插入:
parentNode->InsertFirstChild(childNode);
- 使用InsertEndChild将一个节点作为父节点的最后一个子节点插入:
parentNode->InsertEndChild(childNode);
- 使用InsertAfterChild将一个节点插入到另一个节点之后
parentNode->InsertAfterChild(previousNode, newNode);
- 使用InsertBeforeChild将一个节点插入到另一个节点之前:
parentNode->InsertBeforeChild(nextNode, newNode);
示例代码
#include <iostream>
#include "tinyxml2.h"
int main() {
tinyxml2::XMLDocument doc;
// 创建一个声明节点并将其添加到doc对象中
tinyxml2::XMLDeclaration* declaration = doc.NewDeclaration();
doc.LinkEndChild(declaration);
// 创建根元素
tinyxml2::XMLElement* root = doc.NewElement("Root");
doc.InsertFirstChild(root);
// 创建子元素
tinyxml2::XMLElement* child = doc.NewElement("Child");
child->SetText("Hello, World!");
root->InsertEndChild(child);
// 创建一个包含文本内容的文本节点并插入到child节点中
tinyxml2::XMLText* textNode = doc.NewText("TextContent");
child->InsertEndChild(textNode);
// 创建一个注释节点
tinyxml2::XMLComment* comment = doc.NewComment("This is a comment");
doc.InsertEndChild(comment);
// 创建第二个元素
tinyxml2::XMLElement* parent = doc.NewElement("Parent");
// 将parent添加到root下
doc.InsertEndChild(parent);
// 创建son节点 将son添加到parent下
tinyxml2::XMLElement* son = doc.NewElement("son");
parent->InsertEndChild(son);
// 创建daughter节点 并将daughter节点作为parent第一个节点插入
tinyxml2::XMLElement* daughter = doc.NewElement("daughter");
parent->InsertFirstChild(daughter);
// 创建dog节点并将dog节点作为parent最后一个节点插入
tinyxml2::XMLElement* dog = doc.NewElement("dog");
parent->InsertEndChild(dog);
// 创建cat节点并将cat节点插入到son节点之后
tinyxml2::XMLElement* cat = doc.NewElement("cat");
parent->InsertAfterChild(son, cat);
// 保存XML文档
doc.SaveFile("example.xml");
std::cout << "操作成功!" << std::endl;
return 0;
}
运行结果
example.xml
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<Child>Hello, World!TextContent</Child>
</Root>
<!--This is a comment-->
<Parent>
<daughter/>
<son/>
<cat/>
<dog/>
</Parent>
4.5 删除节点
接口介绍
- 获取XML文档对象的根节点
doc.RootElement();
- 获取某节点的第一个孩子节点
node.FirstChildElement();
此方法功能为获取某个节点的第一个孩子节点,如果添加了一个字符串参数,如
node.FirstChildElement("child")
表示要获取node节点的第一个名为child的节点。
示例代码
#include <iostream>
#include "tinyxml2.h"
int main() {
// 创建XML文档对象
tinyxml2::XMLDocument doc;
// 加载XML文件
if (doc.LoadFile("file/example.xml") == tinyxml2::XML_SUCCESS) {
// 获取根节点
tinyxml2::XMLElement* root = doc.RootElement();
// 根据节点名字查找要删除的节点
tinyxml2::XMLElement* nodeToDelete = root->FirstChildElement("Child");
if (nodeToDelete) {
// 删除节点
root->DeleteChild(nodeToDelete);
// 保存修改后的XML文档
if (doc.SaveFile("example_modified.xml") == tinyxml2::XML_SUCCESS) {
std::cout << "节点删除成功,并保存修改后的XML文件。" << std::endl;
} else {
std::cout << "保存XML文件失败。" << std::endl;
}
} else {
std::cout << "未找到要删除的节点。" << std::endl;
}
} else {
std::cout << "加载XML文件失败。" << std::endl;
}
return 0;
}
运行结果
原文件example.xml
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<Child>Hello, World!TextContent</Child>
</Root>
<!--This is a comment-->
<Parent>
<daughter/>
<son/>
<cat/>
<dog/>
</Parent>
删除后的文件example_modified.xml
<?xml version="1.0" encoding="UTF-8"?>
<Root/>
<!--This is a comment-->
<Parent>
<daughter/>
<son/>
<cat/>
<dog/>
</Parent>
4.6 修改节点的文本值
修改节点文本值常用方法为
接口介绍
-
设置node节点的名字
node->SetName(newName)
-
设置node节点的内容文本值
node->SetText(newText)
示例程序
#include <iostream>
#include "tinyxml2.h"
int main() {
// 创建XML文档对象
tinyxml2::XMLDocument doc;
// 加载XML文件
if (doc.LoadFile("example.xml") == tinyxml2::XML_SUCCESS) {
// 获取根节点
tinyxml2::XMLElement* root = doc.RootElement();
// 根据节点名字查找要修改的节点
tinyxml2::XMLElement* nodeToModify = root->FirstChildElement("Child");
if (nodeToModify) {
// 修改节点的名字和文本
nodeToModify->SetName("NewName");
nodeToModify->SetText("NewText");
// 保存修改后的XML文档
if (doc.SaveFile("example_modified.xml") == tinyxml2::XML_SUCCESS) {
std::cout << "节点修改成功,并保存修改后的XML文件。" << std::endl;
} else {
std::cout << "修改XML文件失败。" << std::endl;
}
} else {
std::cout << "未找到要修改的节点。" << std::endl;
}
} else {
std::cout << "加载XML文件失败。" << std::endl;
}
return 0;
}
运行结果
Modify改之前的xml
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<Child>Hello, World!TextContent</Child>
</Root>
<!--This is a comment-->
<Parent>
<daughter/>
<son/>
<cat/>
<dog/>
</Parent>
Modify改后的xml
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<Child>Hello, World!TextContent</Child>
</Root>
<!--This is a comment-->
<Parent>
<daughter/>
<son/>
<cat/>
<dog/>
</Parent>
4.7 设置节点参数
接口介绍
- 为node节点设置参数
node->setAttribute(attrName, attrValue);
示例代码
#include <iostream>
#include "tinyxml2.h"
int main() {
// 创建XML文档对象
tinyxml2::XMLDocument doc;
// 加载XML文件
if (doc.LoadFile("example.xml") == tinyxml2::XML_SUCCESS) {
// 获取根节点
tinyxml2::XMLElement* root = doc.RootElement();
// 根据节点名字查找要修改的节点
tinyxml2::XMLElement* nodeToModify = root->FirstChildElement("Child");
if (nodeToModify) {
// 修改节点的名字和文本
nodeToModify->SetAttribute("name", "Jack");
nodeToModify->SetAttribute("age", 6);
// 保存修改后的XML文档
if (doc.SaveFile("example_modified.xml") == tinyxml2::XML_SUCCESS) {
std::cout << "节点修改成功,并保存修改后的XML文件。" << std::endl;
} else {
std::cout << "修改XML文件失败。" << std::endl;
}
} else {
std::cout << "未找到要修改的节点。" << std::endl;
}
} else {
std::cout << "加载XML文件失败。" << std::endl;
}
return 0;
}
运行结果
原始xml文件
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<Child>Hello, World!TextContent</Child>
</Root>
<!--This is a comment-->
<Parent>
<daughter/>
<son/>
<cat/>
<dog/>
</Parent>
设置属性后xml文件
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<Child name="Jack" age="6">Hello, World!TextContent</Child>
</Root>
<!--This is a comment-->
<Parent>
<daughter/>
<son/>
<cat/>
<dog/>
</Parent>
4.8 查询节点(获取节点名字、节点内容文本)
接口介绍
- 获取节点的名字
node->Name()
- 获取节点的内容文本值
node->GetText()
示例程序
#include <iostream>
#include "tinyxml2.h"
int main() {
// 创建XML文档对象
tinyxml2::XMLDocument doc;
// 加载XML文件
if (doc.LoadFile("example.xml") == tinyxml2::XML_SUCCESS) {
// 获取根节点
tinyxml2::XMLElement* root = doc.RootElement();
// 获取根节点下的第一个子节点
tinyxml2::XMLElement* firstNode = root->FirstChildElement();
if (firstNode) {
// 获取节点的名字
std::string nodeName = firstNode->Name();
printf("node name is %s\n", nodeName.c_str());
// 获取节点的内容文本值
std::string nodeConrtext = firstNode->GetText();
printf("node text is %s\n", nodeConrtext.c_str());
} else {
std::cout << "未找到节点。" << std::endl;
}
} else {
std::cout << "加载XML文件失败。" << std::endl;
}
return 0;
}
运行结果
使用的xml文件
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<Child>Hello, World!TextContent</Child>
</Root>
<!--This is a comment-->
<Parent>
<daughter/>
<son/>
<cat/>
<dog/>
</Parent>
控制台输出:
node name is Child
node text is Hello, World!TextContent
4.9 查询节点(获取节点属性值)
接口介绍
-
获取节点node名为name的参数值
node->Attribute(name)
-
获取attr指向参数对象的参数名
attr->Name()
-
获取attr指向参数对象的参数值
attr->Value()
-
获取attr指向参数对象的下一个参数对象指针
attr = attr->Next()
示例程序
#include <iostream>
#include "tinyxml2.h"
int main() {
// 创建XML文档对象
tinyxml2::XMLDocument doc;
// 加载XML文件
if (doc.LoadFile("example.xml") == tinyxml2::XML_SUCCESS) {
// 获取根节点
tinyxml2::XMLElement* root = doc.RootElement();
// 获取根节点下的第一个子节点
tinyxml2::XMLElement* firstNode = root->FirstChildElement();
if (firstNode) {
// 获取名为name的参数值
const char* attrNameValue = firstNode->Attribute("name");
if (!attrNameValue) {
std::cout << "Failed to retrieve parameter attribute." << std::endl;
return 0;
}
std::cout << "Parameter name value: " << attrNameValue << std::endl;
// 遍历获取节点的所有参数
const tinyxml2::XMLAttribute *attr = firstNode->FirstAttribute();
while (attr) {
std::string attrName = attr->Name();
std::string attrValue = attr->Value();
printf("param name is: %s, param value is: %s\n", attrName.c_str(), attrValue.c_str());
attr = attr->Next();
}
} else {
std::cout << "未找到节点。" << std::endl;
}
} else {
std::cout << "加载XML文件失败。" << std::endl;
}
return 0;
}
运行结果
使用的xml文件
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<Child name="Jack" age="6">Hello, World!TextContent</Child>
</Root>
<!--This is a comment-->
<Parent>
<daughter/>
<son/>
<cat/>
<dog/>
</Parent>
控制台运行输出结果
Parameter name value: Jack
param name is: name, param value is: Jack
param name is: age, param value is: 6