推荐使用 TinyXML2 库而非手写 XML 解析器,因其仅需两个文件、无依赖、API 简洁;支持加载、遍历、修改和保存 XML,需注意错误检查与空指针判断。

用 C++ 实现一个“从零开始”的完整 XML 解析器工程量大、易出错,不推荐在实际项目中手写;更高效可靠的做法是使用成熟轻量的第三方库——TinyXML2。它只有两个文件(tinyxml2.h 和 tinyxml2.cpp),无依赖、头文件友好、API 简洁,非常适合嵌入式或中小型数据处理场景。
快速集成 TinyXML2
下载源码(GitHub 搜索 tinyxml2)后,将 tinyxml2.h 和 tinyxml2.cpp 加入你的项目即可。CMake 中只需:
-
// 添加源文件
add_executable(myapp main.cpp tinyxml2.cpp) -
// 在 main.cpp 开头包含头文件
#include "tinyxml2.h"
读取并遍历 XML 文件
假设你有如下 config.xml:
Alice 28 Bob 32
用 TinyXML2 解析并提取信息:
立即学习“C++免费学习笔记(深入)”;
- 创建
tinyxml2::XMLDocument对象 - 调用
LoadFile()加载文件(返回值为tinyxml2::XMLError,需检查是否成功) - 用
FirstChildElement("root")定位根节点 - 循环调用
NextSiblingElement("user")遍历所有 user 节点 - 用
Attribute("id")获取属性,FirstChildElement("name")->GetText()获取子节点文本
修改与保存 XML
TinyXML2 支持在内存中动态构建和修改文档:
- 用
NewElement()创建新节点,NewText()创建文本内容 - 用
LinkEndChild()或InsertEndChild()添加子节点 - 用
DeleteChild()删除节点,SetAttribute()修改属性 - 最后调用
SaveFile("output.xml")写入磁盘
注意:所有字符串操作默认使用 UTF-8 编码,无需额外转码。
错误处理与注意事项
常见问题要主动检查:
-
LoadFile()返回非XML_SUCCESS?说明文件不存在、格式错误或编码异常(如含 BOM 的 UTF-8 可能触发解析失败) - 获取元素或文本前,务必判空:
if (elem && elem->GetText()) - 节点指针(
XMLElement*)不拥有内存所有权,文档对象销毁后指针失效 - 避免在循环中反复调用
FirstChildElement(),应缓存结果或使用迭代器风格遍历
基本上就这些。TinyXML2 不复杂但容易忽略错误检查,加几行判断就能避开 90% 的运行时崩溃。











