0

0

c++如何操作XML属性值_c++ Markup库解析与节点遍历【实战】

穿越時空

穿越時空

发布时间:2025-12-29 16:27:09

|

381人浏览过

|

来源于php中文网

原创

用 tinyxml 读取 XML 属性值需先定位节点再调用 Attribute("name"),返回 const char* 需判空;遍历子节点须用 FirstChildElement() 避免文本节点崩溃;修改属性后必须调用 doc.SaveFile() 才能保存。

c++如何操作xml属性值_c++ markup库解析与节点遍历【实战】

如何用 C++ Markup 库读取 XML 属性值

Markup 库(tinyxml2 的轻量替代,常指 rapidxml 或更常见的 tinyxml;但标题中明确写的是 “Markup”,实际多指 tinyxml 的旧版 TiXmlDocument / TiXmlElement)本身不叫 “Markup 库”,而是 tinyxml。如果你看到项目里用了 #include "tinyxml.h"TiXmlElement,那就是它。

读取属性值的关键是:先定位到目标节点,再调用 Attribute() 方法。它返回 const char*,不是 std::string,空属性或不存在时返回 nullptr,必须判空。

  • Attribute("name") 返回 const char*,直接赋给 std::string 会崩溃(若为 nullptr
  • 推荐写法:
    const char* val = elem->Attribute("id");
    std::string id = val ? val : "";
  • 属性名区分大小写,Attribute("ID")Attribute("id") 是不同键
  • 不支持 XPath,不能跳过层级直接查;必须逐层 FirstChildElement()

如何安全遍历所有子节点并过滤元素节点

TiXmlNode 是基类,包含元素、文本、注释等多种类型。直接用 FirstChild() 遍历时,会拿到文本节点(如换行、空格),导致 toElement() 返回 nullptr,解引用崩溃。

  • 永远用 FirstChildElement() 替代 FirstChild() 起始遍历,它自动跳过非元素节点
  • 若需混合处理(比如想跳过注释但保留文本),则必须显式判断:
    for (TiXmlNode* node = parent->FirstChild(); node; node = node->NextSibling()) {
        if (node->Type() == TiXmlNode::ELEMENT) {
            TiXmlElement* elem = node->ToElement();
            // 处理 elem
        }
    }
  • NextSiblingElement("tag") 可按名称跳转,比通用 NextSibling() 更安全

修改属性值后为何保存不生效

TiXmlElement::SetAttribute() 确实会更新内存中的节点,但不会自动触发写回磁盘。常见错误是调用完就结束程序,没调用 SaveFile()

笔灵AI论文写作
笔灵AI论文写作

免费生成毕业论文、课题论文、千字大纲,几万字专业初稿!

下载

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

  • 修改后必须调用文档根节点的 SaveFile("path.xml"),不是元素自己的方法
  • SaveFile() 返回 bool,失败时不抛异常,要检查返回值:
    if (!doc.SaveFile("config.xml")) {
        std::cerr << "Failed to save XML\n";
    }
  • 如果 XML 文件被其他进程占用(如编辑器锁住),SaveFile() 会静默失败
  • 中文路径在 Windows 下可能乱码,建议用 UTF-8 编码保存,并确保终端/IDE 支持

tinyxml 与 tinyxml2 混用会导致什么问题

两者 API 完全不兼容,但头文件名相似(tinyxml.h vs tinyxml2.h),命名空间也无隔离,极易误连、误 include。

  • 同时链接 libtinyxml.alibtinyxml2.a 会导致符号冲突,link 阶段报 multiple definition
  • TiXmlElement(tinyxml)和 tinyxml2::XMLElement(tinyxml2)是完全不同的类型,强制转换会崩溃
  • CMake 中务必确认 find_package(tinyxml2) 不会意外拉入旧版;检查 pkg-config --modversion tinyxmltinyxml2 是否共存
  • 新项目一律用 tinyxml2:它线程安全、无内存泄漏风险、API 更现代;tinyxml 已停止维护多年

属性操作本身很简单,难的是节点定位的健壮性——空节点、嵌套深度、编码、跨平台路径,这些地方一漏,程序就在客户环境里静默失败。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

311

2023.08.02

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

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

1846

2024.04.01

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

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

2080

2024.08.01

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

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

917

2024.11.28

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

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

517

2023.09.20

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

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

517

2023.09.20

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

466

2023.08.10

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

502

2023.07.26

ip地址修改教程大全
ip地址修改教程大全

本专题整合了ip地址修改教程大全,阅读下面的文章自行寻找合适的解决教程。

121

2025.12.26

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
HTML5/CSS3/JavaScript/ES6入门课程
HTML5/CSS3/JavaScript/ES6入门课程

共102课时 | 6.5万人学习

前端基础到实战(HTML5+CSS3+ES6+NPM)
前端基础到实战(HTML5+CSS3+ES6+NPM)

共162课时 | 18.4万人学习

第二十二期_前端开发
第二十二期_前端开发

共119课时 | 12.1万人学习

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

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