tinyXML2
前言
TinyXML-2 是一个简单,小型,高效的 C ++ XML 解析器,可以轻松集成到其他程序中,直接引用源文件的话只需要包含两个文件(h 和 cpp)
TinyXML-2 解析 XML 文档,并以此为基础构建可读取,修改和保存的文档对象模型(DOM)。
1.tinyxml2对象
XMLDocument 是 TinyXML2 的核心对象,用于表示整个 XML 文档。它可以用于解析 XML 文件或从头开始创建新的 XML 文档。
XMLElement 表示 XML 文档中的元素。每个元素可以包含其他元素、属性和文本内容。XMLElement 对象提供了方法来获取和修改元素的名称、属性和内容。
XMLAttribute 用于表示 XML 元素的属性。每个属性由名称和值组成,可以通过 XMLElement 对象的方法来访问和修改属性。
XMLText 用于表示 XML 元素中的文本内容。它可以包含文本节点中的实际文本数据,可以通过 XMLElement 对象的方法来获取和修改文本内容。
XMLComment 用于表示 XML 中的注释。它可以包含注释节点中的实际注释内容,可以通过 XMLElement 对象的方法来获取和修改注释内容。
2.基本使用
下载地址:https://github.com/leethomason/tinyxml2
tinyxml2
使用方式非常简单,只需要将tinyxml2.cpp
和tinyxml.h
拷贝到项目目录,并在使用到tinyxml的文件中包含tinyxml.h头文件以及引入命名空间即可(要确保编译器能识别)。
不需要编译即可直接使用。
//引入头文件
#include "tinyxml2.h"
//tinyxml2的类在tinyxml2命名空间
using namespace tinyxml2;
3.tinyxml操作
数据类型获取与设置
使用 IntAttribute()
、DoubleAttribute()
、StringAttribute()
等方法获取属性值。
// 获取属性值
int intAttr = child->IntAttribute("intAttr", 0); // 默认值0
double doubleAttr = child->DoubleAttribute("doubleAttr", 0.0); // 默认值0.0
const char* stringAttr = child->StringAttribute("stringAttr"); // 可能返回nullptr
使用 SetAttribute()
方法设置属性值。
// 使用SetAttribute()设置属性值
child->SetAttribute("id", 1); // 设置整型属性
child->SetAttribute("name", "John"); // 设置字符串属性
child->SetAttribute("value", 3.14); // 设置浮点型属性
保存到文件
使用 XMLDocument::SaveFile()
方法将 XML 文档保存到文件。
// 保存XML文档到文件
doc.SaveFile("example.xml");
从字符串中解析
使用 XMLDocument::Parse()
方法从字符串解析 XML。
生成字符串
使用 XMLDocument::Print()
或 XMLPrinter
类将 XML 文档转换为字符串。
4.tinyxml接口详解
4.1 创建xml文档
使用tinyxml中的XMLDocument对象可以实现xml文件的创建。
接口介绍
1.创建新的Declaration对象
NewDeclaration()
2.将新的子元素添加到调用此接口的XML元素的末尾
InsertEndChild()
3.创建新的Elements元素对象
NewElement()
4.保存文档到文件,在对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 version="1.0" encoding="UTF-8"?>
<Root>
<Child>Hello, World!</Child>
</Root>
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文档
将给定的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;
}
打印结果
4.4创建节点
1.使用NewElement创建新的元素节点:
tinyxml2::XMLElement* element = doc.NewElement("ElementName");
2.使用NewText创建一个包含文本内容的文本节点:
tinyxml2::XMLText* textNode = doc.NewText("TextContent");
3.使用NewComment 创建注释节点
tinyxml2::XMLComment* comment = doc.NewComment("This is a comment");
4.使用NewDeclaration创建一个声明节点:
tinyxml2::XMLDeclaration* declaration = doc.NewDeclaration();
5.使用NewDocument创建一个新的XML文档节点:
tinyxml2::XMLDocument* newDocument = new tinyxml2::XMLDocument();
6.使用InsertFirstChild将一个节点作为父节点的第一个子节点插入:
parentNode->InsertFirstChild(childNode);
7.使用InsertEndChild将一个节点作为父节点的最后一个子节点插入:
parentNode->InsertEndChild(childNode);
8.使用InsertAfterChild将一个节点插入到另一个节点之后
parentNode->InsertAfterChild(previousNode, newNode);
9.使用InsertBeforeChild将一个节点插入到另一个节点之前:
parentNode->InsertBeforeChild(nextNode, newNode);
4.5删除节点
-
获取XML文档对象的根节点
doc.RootElement();
-
获取某节点的第一个孩子节点
node.FirstChildElement();
4.6 修改节点的文本值
1.设置node节点的名字
node->SetName(newName)
2.设置node节点的内容文本值
node->SetText(newText)
5生成示例xml文件:
main.cpp文件:(需要自己编写)
// An highlighted block
#include <iostream>
#include"tinyxml2.h"
using namespace std;
using namespace tinyxml2;
void createXml()
{
//------------
//声明要创建的xml文件
//------------
tinyxml2::XMLDocument xml;
tinyxml2::XMLDeclaration* declaration = xml.NewDeclaration();
xml.InsertFirstChild(declaration);
//------------
//创建根节点
//------------
tinyxml2::XMLElement* rootNode = xml.NewElement("computer");
xml.InsertEndChild(rootNode);
//------------
//创建子节点
//------------
tinyxml2::XMLElement* root_1_NodeComputerMonitor = xml.NewElement("ComputerMonitor");
tinyxml2::XMLElement* root_1_NodeKeyboard = xml.NewElement("Keyboard");
tinyxml2::XMLElement* root_1_CPU = xml.NewElement("CPU");
//------------
//给子节点增加内容
//------------
tinyxml2::XMLText* text_root_1_NodeComputerMonitor = xml.NewText("SAMSUNG");
root_1_NodeComputerMonitor->InsertFirstChild(text_root_1_NodeComputerMonitor);
tinyxml2::XMLText* text_root_1_root_1_CPU = xml.NewText("intel");
root_1_CPU->InsertFirstChild(text_root_1_root_1_CPU);
//------------
//给子节点增加内容
//------------
root_1_NodeComputerMonitor->SetAttribute("size", "15");
root_1_CPU->SetAttribute("series", "XEON");
//------------
//创建子节点的子节点
//------------
tinyxml2::XMLElement* root_2_NodeKeyboardAttribute = xml.NewElement("KeyboardAttribute");
//------------
//给子节点的子节点增加内容
//------------
tinyxml2::XMLText* text_root_2_NodeKeyboardAttribute = xml.NewText("cherry Mechanical Keyboard");
root_2_NodeKeyboardAttribute->InsertFirstChild(text_root_2_NodeKeyboardAttribute);
//------------
//构建xml树,根节点的下的子节点树
//------------
rootNode->InsertEndChild(root_1_NodeComputerMonitor);//childNodeStu是root的子节点
rootNode->InsertEndChild(root_1_NodeKeyboard);
rootNode->InsertEndChild(root_1_CPU);
//------------
//构建xml树,根节点的下的子节点的子节点树
//------------
root_1_NodeKeyboard->InsertEndChild(root_2_NodeKeyboardAttribute);
//------------
//将xml保存到当前项目中
//------------
xml.SaveFile("computer.xml");
}
void deCodeXml()
{
//------------
//声明
//------------
tinyxml2::XMLDocument xml;
//------------
//导入xml文件
//------------
if (xml.LoadFile("computer.xml") != XML_SUCCESS)
{
return;
}
//------------
//找到导入的xml的根节点
//------------
tinyxml2::XMLElement* rootNode = xml.RootElement();
if (rootNode == NULL) {
return;
}
//------------
//读取第一层子节点信息并且打印在控制台上
//------------
tinyxml2::XMLElement* root_1_NodeComputerMonitor = rootNode->FirstChildElement("ComputerMonitor");
std::string text_root_1_NodeComputerMonitor = root_1_NodeComputerMonitor->GetText();
cout << "text_root_1_NodeComputerMonitor = " << text_root_1_NodeComputerMonitor.c_str() << endl;
//------------
//读取第二层子节点信息并且打印在控制台上
//------------
tinyxml2::XMLElement* root_1_NodeKeyboard = rootNode->FirstChildElement("Keyboard");
tinyxml2::XMLElement* root_2_NodeKeyboardAttribute = root_1_NodeKeyboard->FirstChildElement("KeyboardAttribute");
std::string text_root_2_NodeKeyboardAttribute = root_2_NodeKeyboardAttribute->GetText();
cout << "text_root_2_NodeKeyboardAttribute = " << text_root_2_NodeKeyboardAttribute.c_str() << endl;
}
int main()
{
cout << "----------------------begin create xml-----------------------" << endl;
createXml();
cout << "----------------------finished create xml--------------------" << endl;
cout << "-----------------------begin read xml------------------------" << endl;
deCodeXml();
cout << "-----------------------finished read xml---------------------" << endl;
return 0;
}
生成的xml文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<computer>
<ComputerMonitor size="15">SAMSUNG</ComputerMonitor>
<Keyboard>
<KeyboardAttribute>cherry Mechanical Keyboard</KeyboardAttribute>
</Keyboard>
<CPU series="XEON">intel</CPU>
</computer>
以上就是tinyxml2生成xml文件方法@TOC