引言
在现代软件开发中,XML文件作为一种标准的数据交换格式,被广泛应用于不同的应用程序和系统之间。在Qt框架中,提供了QXmlStreamReader
和QXmlStreamWriter
两个强大的类,用于读写XML文件。本文将详细介绍这两个类的使用方法,并通过实例来演示如何高效处理XML数据。
一、Qt中处理XML文件的基础
XML(可扩展标记语言)是一种用于标记电子文件使其具有结构性的标记语言。它允许用户自定义标签,使得信息分类更加清晰。Qt框架通过QXmlStreamReader
和QXmlStreamWriter
类提供了一个高效的方式来处理这种格式的数据。
二、使用QXmlStreamReader读取XML文件
-
创建QXmlStreamReader实例
-
遍历XML文档
-
处理XML元素
-
错误处理
三、使用QXmlStreamWriter写入XML文件
-
创建QXmlStreamWriter实例
-
写入XML元素
-
格式化输出
四、实际应用示例
我们以将一个QList<QString>写入XML并且进行读取为例
<?xml version="1.0" encoding="UTF-8"?>
<Tools>
<Tool>
<Path>F:/softfile/12.15/ANSN/ANSN/ASNS/Release/plustookitModels/ArmL-30.stl</Path>
</Tool>
<Tool>
<Path>F:/softfile/12.15/ANSN/ANSN/ASNS/Release/plustookitModels/Block4x4-ThreeHoles.stl</Path>
</Tool>
<Tool>
<Path>F:/softfile/12.15/ANSN/ANSN/ASNS/Release/plustookitModels/Cautery.stl</Path>
</Tool>
</Tools>
写入函数
bool writeListToXml(const QString& filePath, const QList<QString>& list) {
QFile file(filePath);
if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
qWarning() << "Unable to open file:" << filePath;
return false;
}
QXmlStreamWriter xmlWriter(&file);
xmlWriter.setAutoFormatting(true);
xmlWriter.writeStartDocument();
xmlWriter.writeStartElement("Tools");
for (const QString& toolPath : list) {
xmlWriter.writeStartElement("Tool");
xmlWriter.writeTextElement("Path", toolPath);
xmlWriter.writeEndElement();
}
xmlWriter.writeEndElement();
xmlWriter.writeEndDocument();
file.close();
return true;
}
读取函数
QList<QString> readListFromXml(const QString &filePath)
{
QList<QString> toolsList;
QFile file(filePath);
if (!file.open(QIODevice::ReadOnly)) {
qWarning() << "Unable to open file:" << filePath;
return toolsList;
}
QXmlStreamReader xmlReader(&file);
// 读取 XML 直到结束
while (!xmlReader.atEnd() && !xmlReader.hasError()) {
xmlReader.readNext();
// 如果是 Tool 元素的开始
if (xmlReader.isStartElement() && xmlReader.name() == "Tool") {
// 读取 Tool 元素内部
while (!(xmlReader.tokenType() == QXmlStreamReader::EndElement && xmlReader.name() == "Tool")) {
xmlReader.readNext();
// 如果是 Path 元素的开始
if (xmlReader.isStartElement() && xmlReader.name() == "Path") {
QString toolPath = xmlReader.readElementText();
toolsList.append(toolPath);
qDebug() << toolPath;
}
}
}
}
// 检查 XML 是否有解析错误
if (xmlReader.hasError()) {
qWarning() << "XML error:" << xmlReader.errorString();
}
file.close();
return toolsList;
}