XML解析库tinyxml2库使用详解

XML语法规则介绍及总结-CSDN博客

TinyXML-2 是一个简单轻量级的 C++ XML 解析库,它提供了一种快速、高效地解析 XML 文档的方式。

1. 下载地址

Gitee 极速下载/tinyxml2

2. 基本用法

下面将详细介绍 TinyXML-2 的主要使用方法:

2.1. 引入头文件和命名空间

#include "tinyxml2.h"
using namespace tinyxml2;

2.2. 解析 XML 文档

XMLDocument doc;
doc.LoadFile("example.xml");
if (doc.ErrorID() != XML_SUCCESS) {
    // 处理错误
    return;
}

2.3. 访问根节点

XMLElement* root = doc.RootElement();

2.4. 遍历子节点

for (XMLElement* elem = root->FirstChildElement(); elem; elem = elem->NextSiblingElement()) {
    // 处理节点
}

2.5. 读取节点属性

const char* attr = elem->Attribute("name");
if (attr) {
    // 处理属性值
}
    1. 读取节点文本内容

    const char* text = elem->GetText();
    if (text) {
    // 处理文本内容
    }

2.7. 除了遍历和读取节点,TinyXML-2 还提供了丰富的节点操作 API,包括创建、插入、删除、克隆节点等。

// 创建新节点并插入到现有节点下
XMLElement* newElem = doc.NewElement("new_element");
root->InsertEndChild(newElem);

// 删除节点
root->DeleteChild(newElem);

// 克隆节点
XMLElement* clonedElem = newElem->DeepClone(&doc);
root->InsertEndChild(clonedElem);

2.8. 创建新节点并添加到文档

XMLElement* newElem = doc.NewElement("new_element");
newElem->SetAttribute("attribute", "value");
newElem->SetText("New element text");
root->InsertEndChild(newElem);

2.9. 文档操作

TinyXML-2 不仅可以解析现有的 XML 文档,还可以创建新的 XML 文档,并进行保存和打印操作。

// 创建新文档
XMLDocument doc;
XMLDeclaration* decl = doc.NewDeclaration();
doc.InsertFirstChild(decl);
XMLElement* root = doc.NewElement("root");
doc.InsertEndChild(root);

// 保存文档
doc.SaveFile("new_document.xml");

// 打印文档
doc.Print();

2.10. 保存 XML 文档

doc.SaveFile("new_example.xml");

2.11. 错误处理

TinyXML-2 提供了丰富的错误处理机制。您可以通过检查 doc.ErrorID() 和 doc.ErrorName() 来获取错误编号和错误信息。

if (doc.ErrorID() != XML_SUCCESS) {
    printf("Error loading file: %s\n", doc.ErrorName());
    return;
}

2.12.内存管理

TinyXML-2 使用自己的内存管理机制,无需手动分配和释放内存。所有的内存分配和释放都由库内部完成。

3. 代码示例

生成一个xml,用于保存照片路径,GPS信息及缺陷信息等。

#include "tinyxml2.h"
#include <string>
using namespace tinyxml2;

int SaveInfo(std::string xmlFile, std::string imagePath, 
                            std::string *calssName, int calssNameNum, 
                            double lon, double lat, double alt)
{
    XMLDocument* doc = new XMLDocument();
    if(doc == NULL)
    {   
        printf("New  xml is NULL!\n");
        return -1;
    }

    if(xmlFile.empty())    
    {
        printf("xmlFile path is NULL!\n");
        return -1;
    }
    // 创建xml
    const char* declaration ="<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>";
    doc->Parse(declaration);//会覆盖xml所有内容
    
    //创建根目录
    XMLElement* root = doc->NewElement("Result");
    doc->InsertEndChild(root);
    //路径
    XMLElement* imagePathNode = doc->NewElement("imagePath");
    imagePathNode->InsertEndChild(doc->NewText(imagePath.c_str()));
    root->InsertEndChild(imagePathNode);
    //缺陷类别
    XMLElement* classTypeNode = doc->NewElement("classType");
    for(int i = 0; i < calssNameNum; i++)
    {
        XMLElement* classNameNode = doc->NewElement("className");
        XMLText* classNameText=doc->NewText(calssName[i].c_str()); 
        classNameNode->InsertEndChild(classNameText);
        classTypeNode->InsertEndChild(classNameNode);
    }
    root->InsertEndChild(classTypeNode);
    
    //经度
    XMLElement* gpsNode = doc->NewElement("gps");
    XMLElement* longitudeNode = doc->NewElement("longitude");
    XMLText* lonText=doc->NewText(std::to_string(lon).c_str()); 
    longitudeNode->InsertEndChild(lonText);
    //纬度
    XMLElement* latitudeNode = doc->NewElement("latitude");
    XMLText* latText=doc->NewText(std::to_string(lat).c_str()); 
    latitudeNode->InsertEndChild(latText);
    //高度
    XMLElement* altitudeNode = doc->NewElement("altitude");
    XMLText* altText=doc->NewText(std::to_string(alt).c_str());
    altitudeNode->InsertEndChild(altText);
    
    gpsNode->InsertEndChild(longitudeNode);
    gpsNode->InsertEndChild(latitudeNode);
    gpsNode->InsertEndChild(altitudeNode);
    root->InsertEndChild(gpsNode);
    if(XML_SUCCESS != doc->SaveFile((char *)xmlFile.c_str()))
    {
        printf("ERROR: Save xml:%s fail\n", xmlFile.c_str());
        doc->PrintError();
        return -1;
    }
    printf("Save xmlFile success!\n");
    return 0;
}

运行结果:

4. 总结

TinyXML-2 是一个功能强大、易用的 XML 解析库,适合各种 C++ 项目使用

相关推荐
李元豪3 小时前
【智鹿空间】c++实现了一个简单的链表数据结构 MyList,其中包含基本的 Get 和 Modify 操作,
数据结构·c++·链表
冰水°4 小时前
2.5_XXE(XML外部实体注入)
xml·安全·网络安全·xml外部实体注入·外部实体注入·xml漏洞
UestcXiye4 小时前
《TCP/IP网络编程》学习笔记 | Chapter 9:套接字的多种可选项
c++·计算机网络·ip·tcp
爱吃土豆的程序员4 小时前
java XMLStreamConstants.CDATA 无法识别 <![CDATA[]]>
xml·java·cdata
一丝晨光5 小时前
编译器、IDE对C/C++新标准的支持
c语言·开发语言·c++·ide·msvc·visual studio·gcc
丶Darling.5 小时前
Day40 | 动态规划 :完全背包应用 组合总和IV(类比爬楼梯)
c++·算法·动态规划·记忆化搜索·回溯
奶味少女酱~5 小时前
常用的c++特性-->day02
开发语言·c++·算法
我是哈哈hh6 小时前
专题十八_动态规划_斐波那契数列模型_路径问题_算法专题详细总结
c++·算法·动态规划
_小柏_7 小时前
C/C++基础知识复习(15)
c语言·c++
_oP_i7 小时前
cmake could not find a package configuration file provided by “Microsoft.GSL“
c++