假如我们有一个示例xml文件
<?xml version="1.0" encoding="UTF-8"?>
<root>
<person>
<name>John</name>
<age>30</age>
<address>
<street>Main Street</street>
<city>New York</city>
</address>
</person>
<person>
<name>Jane</name>
<age>25</age>
<address>
<street>First Street</street>
<city>San Francisco</city>
</address>
</person>
</root>
Qt代码
#include <QCoreApplication>
#include <QFile>
#include <QXmlStreamReader>
#include <QDebug>
#include <QMap>
// 解析指定名称的标签及其嵌套的子标签,返回标签名称和内容的映射
QMap<QString, QString> parseTags(QXmlStreamReader& xml, const QString& tagName)
{
QMap<QString, QString> tagContents;
QString currentTag = ""; // 当前标签名称
QString currentContent = ""; // 当前标签内容
while (!xml.atEnd() && !xml.hasError()) {
xml.readNext(); // 读取下一个 XML 元素
if (xml.isStartElement()) { // 当前元素是标签的开始标记
currentTag = xml.name().toString(); // 记录标签名称
} else if (xml.isEndElement() && currentTag == tagName) { // 当前元素是标签的结束标记,且标签名称与指定名称相同
tagContents.insert(currentTag, currentContent.trimmed()); // 存储标签名称和内容到映射中
currentTag = ""; // 重置当前标签名称
currentContent = ""; // 重置当前标签内容
} else if (xml.isCharacters() && !xml.isWhitespace()) { // 当前元素是标签的文本内容
currentContent += xml.text().toString(); // 记录标签的文本内容
}
}
return tagContents;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFile file("example.xml"); // 打开 XML 文件
if (!file.open(QFile::ReadOnly | QFile::Text)) {
qDebug() << "Error: Cannot read file " << file.fileName()
<< ": " << file.errorString();
return -1;
}
QXmlStreamReader xml(&file); // 创建 XML 解析器
QString tagName = "title"; // 指定要解析的标签名称
QMap<QString, QString> tagContents = parseTags(xml, tagName); // 解析指定名称的标签及其嵌套的子标签
qDebug() << "Number of <" << tagName << "> tags found: " << tagContents.size(); // 输出找到的标签数量
for (auto i = tagContents.begin(); i != tagContents.end(); ++i) { // 遍历所有找到的标签名称和内容
qDebug() << "Content of <" << i.key() << ">: " << i.value(); // 输出标签名称和内容
}
return a.exec();
}