讲师中心 微信公众号
AI工具推荐 视频效率加速

C++怎么读取xml文件 C++ TinyXML库解析XML文档教程【库使用】

阿萱酱_1578

阿萱酱_1578

发布时间:2026-01-24 15:39:08

|

919人浏览过

|

来源于php中文网

原创

应使用 TinyXML-2 而非已停更的 TinyXML;安装需认准官方 tinyxml2 仓库,CMake 推荐 add_subdirectory 或 find_package,手动集成仅需 tinyxml2.h/.cpp;注意编码与链接选项,避免混用新旧版本;LoadFile() 必须检查返回值及 ErrorID()。

c++怎么读取xml文件 c++ tinyxml库解析xml文档教程【库使用】

直接用 TinyXML-2,别碰原始的 TinyXML(已停止维护,API 设计陈旧,宽字符支持差)。

怎么装 TinyXML-2(不是 TinyXML)

很多人卡在第一步:下错库。官方 GitHub 仓库是 tinyxml2,不是 tinyxml。CMake 项目推荐直接 add_subdirectory 或用 find_package(tinyxml2);手动集成只需把 tinyxml2.h 和 tinyxml2.cpp 加进工程,无依赖。

  • Windows 下若用 MSVC 编译出错,检查是否启用了 /utf-8 或源文件保存为 UTF-8 with BOM(尤其含中文标签时)
  • Linux/macOS 默认没问题,但注意链接时加 -ltinyxml2(如果系统包管理安装)
  • 别把 tinyxml.h / tinyxml.cpp(老版)和 tinyxml2 混在一起,会符号冲突

读取 XML 文件并检查错误的最小安全写法

TinyXML-2 的 LoadFile() 不抛异常,全靠返回值和 ErrorID() 判断失败原因。跳过错误检查等于埋雷。

tinyxml2::XMLDocument doc;
auto result = doc.LoadFile("config.xml");
if (result != tinyxml2::XML_SUCCESS) {
    std::cerr << "XML load failed: " << doc.ErrorName() << " at line " << doc.ErrorLineNum() << "\n";
    return -1;
}
  • ErrorName() 返回的是 const char*,比如 "XML_ERROR_PARSING_ELEMENT",不是字符串描述,别直接 printf
  • ErrorLineNum() 在文件有 BOM 或换行符不一致时可能不准,建议先用文本编辑器确认 XML 格式合法
  • 如果路径含中文,Windows 下需用 doc.LoadFile(L"配置.xml") 并确保传入 XMLDocument 构造时启用宽字符支持(默认不开启)

提取节点内容时最容易漏掉的空指针检查

几乎所有新手写的代码都少一层 nullptr 判定:从 FirstChildElement() 到 GetText() 链式调用中,任意一环为空都会导致崩溃。

Github Stars Analyzer
Github Stars Analyzer

抓取指定 GitHub用户的 Stars 项目,生成标准化中文 Markdown 报告。用户提及「分析 GitHub stars」「导出收藏项目」「汇总 GitHub 星标」「生成 stars 报告」或粘贴含 ?tab=stars 的链接时触发。执行通过 bash...

下载

立即学习“C++免费学习笔记(深入)”;

auto root = doc.FirstChildElement("app");
if (!root) { /* 处理根节点不存在 */ }
<p>auto version = root->FirstChildElement("version");
if (version) {
const char* vstr = version->GetText(); // 这里 vstr 可能为 nullptr(元素存在但无文本)
if (vstr) {
std::string ver(vstr);
}
}
  • GetText() 返回 nullptr 表示该元素没有子文本节点(比如 <version/> 或 <version></version>)
  • 用 QueryIntText() / QueryDoubleText() 更安全,它们内部做了空指针判断并返回错误码
  • 属性值用 Attribute("name") 同样要判空,不能假设属性一定存在

修改后保存 XML 的注意事项

SaveFile() 默认不缩进、不换行,生成的 XML 是一行。需要格式化输出得手动设置:

doc.SetIndent("  "); // 两个空格缩进
doc.SaveFile("output.xml");
  • 保存路径不存在目录时会静默失败(返回 XML_ERROR_FILE_COULD_NOT_BE_OPENED),需提前创建父目录
  • UTF-8 内容保存正常,但若 XML 声明写了 encoding="GB2312",tinyxml2 仍按 UTF-8 写出,不会转码——它不处理编码转换
  • 频繁读写同一个文件时,注意 Windows 下文件被占用可能导致 SaveFile() 失败,建议先 remove() 再保存

真正麻烦的从来不是怎么读,而是 XML 文件本身不规范:注释位置错乱、未闭合标签、非法字符(尤其是控制字符)、BOM 和编码声明不一致。解析前用在线校验工具过一遍,比写十层容错更有用。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

相关专题

更多
pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

4304

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

5557

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

2382

2024.11.28

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2078

2023.09.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1658

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2484

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

5944

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

5309

2023.11.24

C++运算符基础入门
C++运算符基础入门

本专题详细讲解了C++运算符的类型、语法与使用方法,涵盖算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、条件运算符及其他特殊运算符,并通过代码示例解析优先级与结合性。

0

2026.10.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn