0

0

c++中如何实现简单的XML解析_c++处理XML文件的基本思路【汇总】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-01-18 15:44:54

|

165人浏览过

|

来源于php中文网

原创

tinyxml2是c++解析xml最轻量易用的选择:单头文件、无依赖、api简洁;需注意空指针检查、手动设置缩进格式化输出,简单配置场景优于pugixml。

c++中如何实现简单的xml解析_c++处理xml文件的基本思路【汇总】

用 tinyxml2 解析 XML 文件最省心

直接上结论:C++ 标准库不提供 XML 解析能力,tinyxml2 是目前最轻量、最易集成、文档最清晰的第三方选择。它头文件仅一个 tinyxml2.h,编译无依赖,适合嵌入式或命令行工具等对体积敏感的场景。

常见错误是试图手写正则匹配 XML 标签——XML 允许嵌套、属性含引号、CDATA、注释等,正则根本不可靠;也有人选 libxml2,但 C 风格 API 冗长,C++ 封装层又常带额外依赖(如 pkg-config、zlib)。

  • 下载源码后,把 tinyxml2.htinyxml2.cpp 加进工程即可使用
  • 读取文件用 doc.LoadFile("config.xml"),返回 tinyxml2::XML_SUCCESS 才算成功
  • 节点遍历推荐用 FirstChildElement("item") 而非 FirstChild(),避免误触文本节点或注释节点
  • 获取属性值前务必检查指针是否为空:if (elem && elem->Attribute("id")) { ... }

读取属性和文本内容时的空指针陷阱

tinyxml2 的所有查询接口(FirstChildElementAttributeGetText)都可能返回 nullptr 或空指针,不检查就解引用会直接 crash。

典型错误写法:const char* val = elem->FirstChildElement("name")->GetText(); —— 中间任意一环失败,整个链式调用就崩了。

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

Okaaaay
Okaaaay

适用于所有人的AI文本和内容生成器

下载
  • 拆成多步并逐层判空:auto nameElem = elem->FirstChildElement("name"); if (nameElem) { const char* text = nameElem->GetText(); }
  • Attribute() 返回 const char*,但若属性不存在,返回的是 nullptr,不是空字符串
  • GetText() 对空白文本(如 <tag></tag>)返回 nullptr,需用 FirstChild()->ToText() + Value() 组合判断是否为纯空白

修改 XML 并保存回文件的注意事项

tinyxml2 支持在内存中增删改节点,但保存时不会自动格式化(无缩进、无换行),生成的 XML 是单行紧凑格式,不利于人工查看或 diff。

如果你需要可读性输出,必须手动设置:

doc.InsertEndChild(doc.NewDeclaration());
doc.SetIndent("  "); // 每级缩进两个空格
doc.SaveFile("output.xml");
  • SetIndent() 必须在 SaveFile() 前调用,且只对后续保存生效
  • 新增节点要用 doc.NewElement()doc.NewText() 创建,不能用裸 new
  • 删除节点调用 parent->DeleteChild(element),不要直接 delete element
  • 中文文本写入前确保源文件编码是 UTF-8,且 XML 声明中包含 encoding="UTF-8"

不建议在生产环境用 pugixml 做简单解析

pugixml 功能更强(支持 XPath、更灵活的遍历),但对“读几个字段+存个配置”这类简单需求,反而容易踩坑:默认启用 DOM 缓存、内存分配策略较激进、错误提示模糊(比如 parse_error 不告诉你哪一行出错)。

如果你只是从 <config><port>8080</port><debug>true</debug></config> 里取两个值,tinyxml2 5 行代码搞定,pugixml 要处理 xml_parse_result、区分 child_value()text().get(),还容易漏掉 load_string() 的 length 参数。

真正需要 pugixml 的场景是:要查 //user[@active='1']/email 这类表达式,或解析超大 XML(百 MB 级)且对性能有硬要求——否则就是过度设计。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

846

2023.08.22

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

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

1944

2024.04.01

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

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

2118

2024.08.01

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

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

1160

2024.11.28

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

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

558

2023.09.20

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

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

738

2023.08.03

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

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

219

2023.09.04

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

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

1561

2023.10.24

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

23

2026.03.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Rust 教程
Rust 教程

共28课时 | 6.7万人学习

Git 教程
Git 教程

共21课时 | 4.1万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号