tinyXML2

tinyXML2

前言

TinyXML-2 是一个简单,小型,高效的 C ++ XML 解析器,可以轻松集成到其他程序中,直接引用源文件的话只需要包含两个文件(h 和 cpp)

TinyXML-2 解析 XML 文档,并以此为基础构建可读取,修改和保存的文档对象模型(DOM)。

1.tinyxml2对象

  1. XMLDocument:

XMLDocument 是 TinyXML2 的核心对象,用于表示整个 XML 文档。它可以用于解析 XML 文件或从头开始创建新的 XML 文档。

  1. XMLElement:

XMLElement 表示 XML 文档中的元素。每个元素可以包含其他元素、属性和文本内容。XMLElement 对象提供了方法来获取和修改元素的名称、属性和内容。

  1. XMLAttribute:

XMLAttribute 用于表示 XML 元素的属性。每个属性由名称和值组成,可以通过 XMLElement 对象的方法来访问和修改属性。

  1. XMLText:

XMLText 用于表示 XML 元素中的文本内容。它可以包含文本节点中的实际文本数据,可以通过 XMLElement 对象的方法来获取和修改文本内容。

  1. XMLComment:

XMLComment 用于表示 XML 中的注释。它可以包含注释节点中的实际注释内容,可以通过 XMLElement 对象的方法来获取和修改注释内容。

2.基本使用

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

tinyxml2使用方式非常简单,只需要将tinyxml2.cpptinyxml.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删除节点
  1. 获取XML文档对象的根节点

    doc.RootElement();
    
  2. 获取某节点的第一个孩子节点

    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

  • 29
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值