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 = "<

你可能感兴趣的:(Qt基础,qt,xml,流方式,QXmlStream,Reader)