Qt基础|Qt 解析XML方式(三)流方式

一.简介 如果要使用xml解析,需要在 pro 文件中 添加 xml模块
需要用到的类:

  • QXmlStreamReader:提供了一个快速解析器,用于通过简单的流API读取XML。
  • QXmlStreamAttributes:为XML属性。
QXmlStreamReader使用了递增式的解析器,适合于在整个XML文档中查找给定的标签、读入无法放入内存的大文件以及处理XML的自定义数据。
优点:快速、方便,分块读取XML文件,可读取大文件。
缺点:递增式解析器,只能顺序遍历XML文件的元素,不能随机访问。
二.示例 解析下面的xml文档
16 40 17 45

源码:
QFile file("test.xml"); if (!file.open(QIODevice::ReadOnly)) return; QXmlStreamReader reader(&file); // 解析XML直到结束 while (!reader.atEnd()) { // 读取下一个元素 QXmlStreamReader::TokenType nType = reader.readNext(); switch (nType) { case QXmlStreamReader::StartDocument: { // XML版本+编码方式 QString strVersion = reader.documentVersion().toString(); QString strEncoding = reader.documentEncoding().toString(); qDebug()<< strVersion; qDebug()<< strEncoding; break; } case QXmlStreamReader::Comment: { // 注释 QString strComment = reader.text().toString(); qDebug() << strComment; break; } case QXmlStreamReader::ProcessingInstruction: { // 处理指令 QString strProcInstr = reader.processingInstructionData().toString(); qDebug() << strProcInstr << "\r\n"; break; } case QXmlStreamReader::DTD: { //如果有DTD 如下解析 // DTD //QString strDTD = reader.text().toString(); //// DTD 声明 //QString strDTDName = reader.dtdName().toString(); //QString strDTDPublicId = reader.dtdPublicId().toString(); // DTD 公开标识符 //QString strDTDSystemId = reader.dtdSystemId().toString(); // DTD 系统标识符 //qDebug() << QString("DTD : %1").arg(strDTD); //qDebug() << QString("DTD 名称 : %1").arg(strDTDName); //qDebug() << QString("DTD 公开标识符 : %1").arg(strDTDPublicId); //qDebug() << QString("DTD 系统标识符 : %1").arg(strDTDSystemId); //qDebug() << "\r\n"; break; } case QXmlStreamReader::StartElement: { // 开始元素 QString strElementName = reader.name().toString(); //找到根元素 if (QString::compare(strElementName, "People") == 0) { parse(reader); } break; } case QXmlStreamReader::EndDocument: { // 结束文档 qDebug()<<"parse finished"; break; } } }if (reader.hasError()) { //解析出错 qDebug() << QString("错误信息:%1行号:%2列号:%3字符位移:%4").arg(reader.errorString()).arg(reader.lineNumber()).arg(reader.columnNumber()).arg(reader.characterOffset()); }file.close(); // 关闭文件//parse方法 void MainWindow::parse(QXmlStreamReader &reader) { while (!reader.atEnd()) { reader.readNext(); if (reader.isStartElement()) { // 开始元素 QString strElementName = reader.name().toString(); if (QString::compare(strElementName, "WOMAN") == 0 || QString::compare(strElementName, "MAN") == 0) { qDebug() << "WOMAN or MAN"; } else if (QString::compare(strElementName, ("AGE")) == 0) { qDebug()<<"AGE = "<

    推荐阅读