Qt怎么读写XML文件 QXmlStreamReader使用教程

10次阅读

推荐使用QxmlstreamReader和QXmlStreamWriter处理XML文件,二者为轻量级流式解析/生成器,支持逐标记读取、自动转义与标签配对,需手动处理空白、属性校验及文档起止,UTF-8编码开箱即用。

Qt怎么读写XML文件 QXmlStreamReader使用教程

qt 读写 XML 文件推荐用 QXmlStreamReader(读)和 QXmlStreamWriter(写),它们是 Qt 提供的基于事件流的轻量级、高效、内存友好的 XML 处理类,特别适合解析结构清晰或大型 XML 文件,不依赖 dom 树,避免一次性加载全部内容到内存。

用 QXmlStreamReader 解析 XML 文件

它按“逐个标记(Token)”方式顺序读取,类似 SAX 解析器。你需要自己判断当前读到的是开始标签、结束标签、文本内容还是注释等,并做相应处理。

  • 先创建 QFile 打开 XML 文件,再用该文件构造 QXmlStreamReader
  • readNext() 移动到下一个标记,再通过 tokenType() 判断类型(如 StartElementCharactersEndElement
  • 遇到 StartElement 可用 name() 获取标签名,attributes() 获取属性键值对
  • 遇到 Characters 时,用 text().toString().trimmed() 提取有效文本(注意过滤空白)
  • 建议配合 while 循环 + switch 判断 token 类型,结构清晰不易漏处理

常见解析逻辑示例(如读取 <a href="https://seo.sqjnqi.com/tag/c/"><b>c++</b></a> Primer

你可以这样组织代码逻辑:

  • 读到 StartElement 且 name()==”book” → 记录其 id 属性值
  • 接着读到 StartElement 且 name()==”title” → 设一个标志位(如 inTitle = true
  • 下一次读到 CharactersinTitle 为真 → 保存文本内容
  • 读到 EndElement 且 name()==”title” → 清除标志位
  • 读到 EndElement 且 name()==”book” → 完成一条数据,存入容器或处理

用 QXmlStreamWriter 写入 XML 文件

它提供简洁的流式写接口,自动处理缩进(需手动设置)、转义、标签配对等细节。

  • setDevice() 绑定 QFileQByteArray
  • 调用 writeStartDocument() 开始,writeEndDocument() 结束
  • writeStartElement("tag") 写开始标签,writeAttribute("key", "value") 写属性
  • writeCharacters("text") 写文本内容,writeEndElement() 写结束标签
  • 如需格式化输出,可调用 setAutoFormatting(true)setAutoFormattingIndent(2)

注意事项与避坑点

实际使用中容易忽略但关键的细节:

  • QXmlStreamReader 不会自动跳过空白或换行,Characters 可能返回空字符串或换行符,务必用 trimmed() 判断是否为空
  • 读取属性前,确认当前 token 是 StartElement,否则 attributes() 返回空
  • 写 XML 时,如果没调用 writeEndDocument(),可能缺少结尾换行或格式异常
  • 中文内容无需额外编码设置 —— Qt 默认使用 UTF-8,只要源文件和 QFile 都是 UTF-8 编码即可正常读写
  • 若 XML 嵌套深或结构复杂,建议封装成小函数按元素粒度解析(如 parseBook()、parseAuthor()),提升可读性和复用性
text=ZqhQzanResources