在Qt框架的C++开发场景中,XML文件常被用来存储配置信息、传输结构化数据,QXmlStreamReader和QXmlStreamWriter是Qt官方提供的流式XML处理类,无需依赖第三方库即可完成XML的读写操作,性能表现优异且使用逻辑清晰。

QXmlStreamReader读取XML文件
QXmlStreamReader采用流式解析方式,逐段读取XML内容,不会一次性将整个文件加载到内存,适合处理大体积XML文件。核心使用流程分为打开文件、循环读取节点、处理对应节点内容、关闭读取器四个步骤。
读取XML的示例代码
假设我们需要读取如下结构的XML文件,文件名为config.xml:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<server ip="127.0.0.1" port="8080">测试服务器</server>
<timeout>30</timeout>
</config>
读取该文件的完整C++代码如下:
#include <QFile>
#include <QXmlStreamReader>
#include <QDebug>
void readXmlFile(const QString &filePath) {
// 打开XML文件
QFile file(filePath);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
qDebug() << "无法打开文件:" << filePath;
return;
}
QXmlStreamReader reader(&file);
// 循环读取所有节点
while (!reader.atEnd()) {
// 读取下一个节点
reader.readNext();
// 判断节点类型
if (reader.isStartElement()) {
QString elementName = reader.name().toString();
qDebug() << "遇到开始标签:" << elementName;
// 处理server标签
if (elementName == "server") {
// 获取标签属性
QXmlStreamAttributes attrs = reader.attributes();
if (attrs.hasAttribute("ip")) {
qDebug() << "server ip:" << attrs.value("ip").toString();
}
if (attrs.hasAttribute("port")) {
qDebug() << "server port:" << attrs.value("port").toString();
}
// 获取标签内的文本内容
QString text = reader.readElementText();
qDebug() << "server 内容:" << text;
}
// 处理timeout标签
else if (elementName == "timeout") {
QString timeout = reader.readElementText();
qDebug() << "timeout 值:" << timeout;
}
}
}
// 检查解析过程中是否有错误
if (reader.hasError()) {
qDebug() << "XML解析错误:" << reader.errorString();
}
// 关闭文件
file.close();
}
读取逻辑说明
上述代码中,首先通过QFile打开目标XML文件,将文件句柄传递给QXmlStreamReader实例。之后通过while循环不断调用readNext方法推进解析进度,每次解析到一个节点后,通过isStartElement判断是否为开始标签,再通过标签名称匹配不同的处理逻辑。如果是目标标签,可以通过attributes方法获取标签的所有属性,通过readElementText方法读取标签内部的文本内容,该方法会自动定位到对应的结束标签,无需手动处理闭合逻辑。
QXmlStreamWriter写入XML文件
QXmlStreamWriter同样是流式操作,按照调用顺序依次将XML内容写入到设备(如文件、网络流等)中,支持自动处理标签闭合、特殊字符转义,使用起来非常便捷。
写入XML的示例代码
下面的代码会生成一个和上文中config.xml结构一致的XML文件:
#include <QFile>
#include <QXmlStreamWriter>
#include <QDebug>
void writeXmlFile(const QString &filePath) {
// 打开文件用于写入
QFile file(filePath);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
qDebug() << "无法打开文件用于写入:" << filePath;
return;
}
QXmlStreamWriter writer(&file);
// 设置自动格式化,生成的XML会有缩进,可读性更好
writer.setAutoFormatting(true);
// 写入XML声明
writer.writeStartDocument("1.0", true);
// 写入根标签config
writer.writeStartElement("config");
// 写入server标签,带属性
writer.writeStartElement("server");
writer.writeAttribute("ip", "127.0.0.1");
writer.writeAttribute("port", "8080");
writer.writeCharacters("测试服务器");
writer.writeEndElement(); // 闭合server标签
// 写入timeout标签
writer.writeStartElement("timeout");
writer.writeCharacters("30");
writer.writeEndElement(); // 闭合timeout标签
// 闭合根标签config
writer.writeEndElement();
// 结束XML文档
writer.writeEndDocument();
// 关闭文件
file.close();
qDebug() << "XML文件写入完成:" << filePath;
}
写入逻辑说明
写入流程首先打开目标文件,创建QXmlStreamWriter实例并关联文件句柄。通过setAutoFormatting(true)可以让生成的XML自动添加缩进和换行,提升可读性。之后依次调用writeStartDocument写入XML声明,writeStartElement写入开始标签,writeAttribute写入标签属性,writeCharacters写入标签文本内容,writeEndElement闭合当前标签,最后调用writeEndDocument完成文档写入。需要注意的是,开始标签和闭合标签必须成对出现,否则会生成格式错误的XML文件。
注意事项
- 使用QXmlStreamReader解析时,如果XML格式不规范,会通过
hasError方法返回错误,开发时建议添加错误校验逻辑。 - QXmlStreamWriter写入的内容中如果包含
<、>、&等特殊字符,会自动进行转义,无需手动处理。 - 读写文件时需要确保文件路径正确,且有对应的文件读写权限,避免出现文件打开失败的问题。
- 如果需要处理大体积的XML文件,流式解析的方式比DOM解析更节省内存,优先选择QXmlStreamReader。
QtC++QXmlStreamReaderQXmlStreamWriterXML读写修改时间:2026-07-10 07:42:13