推荐使用 TinyXML2 库而非手写 XML 解析器,因其仅需两个文件、无依赖、API 简洁;支持加载、遍历、修改和保存 XML,需注意错误检查与空指针判断。
用 C++ 实现一个“从零开始”的完整 XML 解析器工程量大、易出错,不推荐在实际项目中手写;更高效可靠的做法是使用成熟轻量的第三方库——TinyXML2。它只有两个文件(tinyxml2.h 和 tinyxml2.cpp),无依赖、头文件友好、API 简洁,非常适合嵌入式或中小型数据处理场景。
下载源码(GitHub 搜索 tinyxml2)后,将 tinyxml2.h 和 tinyxml2.cpp 加入你的项目即可。CMake 中只需:
add_executable(myapp main.cpp tinyxml2.cpp)
#include "tinyxml2.h"
假设你有如下 config.xml:
Alice 28Bob 32
用 TinyXML2 解析并提取信息
:
tinyxml2::XMLDocument 对象LoadFile() 加载文件(返回值为 tinyxml2::XMLError,需检查是否成功)FirstChildElement("root") 定位根节点NextSiblingElement("user") 遍历所有 user 节点Attribute("id") 获取属性,FirstChildElement("name")->GetText() 获取子节点文本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% 的运行时崩溃。