C++怎么解析XML TinyXML-2库使用教程

11次阅读

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

C++怎么解析XML TinyXML-2库使用教程

用 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”),支持缩进格式化(默认开启)。

text=ZqhQzanResources