TinyXML-2解析XML只需三步:加载文档、定位节点、提取数据;支持文件/字符串加载,通过FirstChildElement和Attribute等接口遍历元素与属性,注意空指针检查、UTF-8编码及字符串生命周期。

用 TinyXML-2 解析 XML 在 C++ 中非常轻量且直观,核心就三步:加载文档、定位节点、提取数据。它不依赖外部库,头文件即用,适合嵌入式或中小型项目。
一、快速开始:引入与加载 XML
从官网或 GitHub 下载 tinyxml2.h 和 tinyxml2.cpp,加入工程。C++ 中只需包含头文件:
#include "tinyxml2.h"
加载方式有两种:
立即学习“C++免费学习笔记(深入)”;
- 从文件读取:tinyxml2::XMLDocument doc; doc.LoadFile("config.xml");
- 从字符串解析:doc.Parse("
");- hello
务必检查返回值:if (doc.ErrorID() != tinyxml2::XML_SUCCESS) { /* 处理错误 */ }
二、遍历节点:Element 和 Text 的配合
TinyXML-2 中主要操作对象是 XMLElement(代表标签)和 XMLText(代表文本内容)。推荐用父子关系逐层查找:
- 获取根元素:auto* root = doc.FirstChildElement("root");
- 找子元素:auto* item = root->FirstChildElement("item");
- 读取属性:const char* id = item->Attribute("id"); // 返回 const char*
- 读取文本内容:const char* text = item->GetText(); // "hello"
支持链式调用:root->FirstChildElement("item")->Attribute("id"),但要注意空指针,建议每步判空。
三、处理多节点与循环结构
遇到多个同名子节点(如多个 ),用 NextSiblingElement() 迭代:
for (auto* user = root->FirstChildElement("user"); user != nullptr; user = user->NextSiblingElement("user")) {
const char* name = user->Attribute("name");
const char* age = user->FirstChildElement("age")->GetText();
}
注意:参数传入标签名可跳过非目标兄弟节点,避免误匹配。
四、常见坑与注意事项
• TinyXML-2 默认不处理注释和 CDATA,如需保留,初始化时加 doc.SetUserData(nullptr) 并启用相关选项(较新版本支持 XMLDocument::SetUserData() 配合回调);
• 字符串全部以 const char* 形式返回,生命周期绑定文档,不要在 doc 被销毁后使用;
• 中文等 UTF-8 内容无需额外设置,但确保源文件和 XML 文件本身保存为 UTF-8 编码;
• 修改 XML 后写回文件用 doc.SaveFile("out.xml"),支持缩进格式化(默认开启)。










