Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Qt之解析XML(QXmlStreamReader)

Qt之解析XML(QXmlStreamReader)

編輯:關於Android編程

簡述

QXmlStreamReader 類提供了一個快速解析器,用於通過簡單的流 API 讀取格式良好的 XML。與之相對應的是 QXmlStreamWriter(寫入 XML)。

相比較 Qt 自己的 SAX 解析器(見 QXmlSimpleReader),QXmlStreamReader 更快,更方便。某些情況下,在使用 DOM 樹(見 QDomDocument)的應用程序中,它也可能是一個更快,更方便的替代方案。

QXmlStreamReader 可以從 QIODevice(見 setDevice())或原始 QByteArray(見 addData())中讀取數據。

詳細介紹

QXmlStreamReader 的基本概念是將 XML 文檔呈現為標記流,類似於 SAX。

QXmlStreamReader 和 SAX 的主要不同點在於如何呈現 XML 標記。

使用 SAX,應用程序必須提供處理程序(回調函數),在解析器方便的情況下,從解析器中接收所謂的 XML 事件。 使用 QXmlStreamReader,應用程序代碼本身驅動循環,並從 reader 中取出標記,一個接一個。通過調用 readNext() 完成,reader 從輸入流中讀取,直到完成下一個標記,此時返回 tokenType()。然後可以使用一組方便的函數 isStartElement() 和 text() 來檢查標記,以獲取已讀取的信息。這種取出標記的方式最大優點是可以使用它構建遞歸下降解析器,也就是說,可以將 XML 解析代碼輕松地分成不同的方法或類,這使得在解析 XML 時可以輕松跟蹤應用程序自己的狀態。

一個典型的 QXmlStreamReader 循環:




      ]>

    
        <作者>一去丶二三裡
        <主頁>http://blog.csdn.net/liang19890820
        <個人說明>青春不老,奮斗不止!&Copyright;368241647]]>>
    

解析源碼如下:

QFile file("Blogs.xml");
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {  // 以只寫模式打開文件
    QXmlStreamReader reader(&file);

    // 解析 XML,直到結束
    while (!reader.atEnd()) {

        // 讀取下一個元素
        QXmlStreamReader::TokenType nType = reader.readNext();

        switch (nType) {
        case QXmlStreamReader::StartDocument: {  // 開始文檔
            qDebug() << QString::fromLocal8Bit("********** 開始文檔(XML 聲明) ********** ");
            // XML 聲明
            QString strVersion = reader.documentVersion().toString();
            QString strEncoding = reader.documentEncoding().toString();
            bool bAlone = reader.isStandaloneDocument();
            qDebug() << QString::fromLocal8Bit("版本:%1  編碼:%2  Standalone:%3")
                        .arg(strVersion).arg(strEncoding).arg(bAlone) << "\r\n";
            break;
        }
        case QXmlStreamReader::Comment: {  // 注釋
            qDebug() << QString::fromLocal8Bit("********** 注釋 ********** ");
            QString strComment = reader.text().toString();
            qDebug() << strComment << "\r\n";
            break;
        }
        case QXmlStreamReader::ProcessingInstruction: {  // 處理指令
            qDebug() << QString::fromLocal8Bit("********** 處理指令 ********** ");
            QString strProcInstr = reader.processingInstructionData().toString();
            qDebug() << strProcInstr << "\r\n";
            break;
        }
        case QXmlStreamReader::DTD: {   // DTD
            qDebug() << QString::fromLocal8Bit("********** DTD ********** ");
            QString strDTD = reader.text().toString();
            QXmlStreamNotationDeclarations notationDeclarations = reader.notationDeclarations();  // 符號聲明
            QXmlStreamEntityDeclarations entityDeclarations = reader.entityDeclarations();  // 實體聲明
            // DTD 聲明
            QString strDTDName = reader.dtdName().toString();
            QString strDTDPublicId = reader.dtdPublicId().toString();  // DTD 公開標識符
            QString strDTDSystemId = reader.dtdSystemId().toString();  // DTD 系統標識符
            qDebug() << QString::fromLocal8Bit("DTD : %1").arg(strDTD);
            qDebug() << QString::fromLocal8Bit("DTD 名稱 : %1").arg(strDTDName);
            qDebug() << QString::fromLocal8Bit("DTD 公開標識符 : %1").arg(strDTDPublicId);
            qDebug() << QString::fromLocal8Bit("DTD 系統標識符 : %1").arg(strDTDSystemId);
            qDebug() << "\r\n";

            break;
        }
        case QXmlStreamReader::StartElement: {  // 開始元素
            QString strElementName = reader.name().toString();
            if (QString::compare(strElementName, "Blogs") == 0) {  // 根元素
                qDebug() << QString::fromLocal8Bit("********** 開始元素 ********** ");
                QXmlStreamAttributes attributes = reader.attributes();
                if (attributes.hasAttribute("Version")) {
                    QString strVersion = attributes.value("Version").toString();
                    qDebug() << QString::fromLocal8Bit("屬性:Version(%1)").arg(strVersion);
                }

                parseBlog(reader);
            }
            break;
        }
        case QXmlStreamReader::EndDocument: {  // 結束文檔
            qDebug() << QString::fromLocal8Bit("********** 結束文檔 ********** ");
            break;
        }
        }
    }

    if (reader.hasError()) {  // 解析出錯
        qDebug() << QString::fromLocal8Bit("錯誤信息:%1  行號:%2  列號:%3  字符位移:%4").arg(reader.errorString()).arg(reader.lineNumber()).arg(reader.columnNumber()).arg(reader.characterOffset());
    }

    file.close();  // 關閉文件
}

針對 元素中的內容,進行單獨解析:

void parseBlog(QXmlStreamReader &reader) {
    while (!reader.atEnd()) {
        reader.readNext();
        if (reader.isStartElement()) {  // 開始元素
            QString strElementName = reader.name().toString();
            if (QString::compare(strElementName, "Blog") == 0) {
                qDebug() << QString::fromLocal8Bit("********** 開始元素 ********** ");
            } else if (QString::compare(strElementName, QStringLiteral("作者")) == 0) {  // 方式一
                reader.readNext();
                if (reader.isCharacters()) {
                    qDebug() << QStringLiteral("作者:%1").arg(reader.text().toString());
                }
            } else if (QString::compare(strElementName, QStringLiteral("主頁")) == 0) {  // 方式二
                qDebug() << QStringLiteral("主頁:%1").arg(reader.readElementText());
            } else if (QString::compare(strElementName, QStringLiteral("個人說明")) == 0) {
                qDebug() << QStringLiteral("個人說明:%1").arg(reader.readElementText());
            }
        } else if (reader.isEntityReference()) {  // 實體引用
            QString strName = reader.name().toString();
            QString strText = reader.text().toString();
            qDebug() << QString("EntityReference : %1(%2)").arg(strName).arg(strText);
        } else if (reader.isCDATA()) {  // CDATA
            QString strCDATA = reader.text().toString();
            qDebug() << QString("CDATA : %1").arg(strCDATA);

            reader.readNext();
            if (reader.isCharacters()) {
                QString strCharacters = reader.text().toString();
                qDebug() << QString("Characters : %1").arg(strCharacters);
            }
        } else if (reader.isEndElement()) {  // 結束元素
            QString strElementName = reader.name().toString();
            if (QString::compare(strElementName, "Blogs") == 0) {
                qDebug() << QString::fromLocal8Bit("********** 結束元素 ********** ");
                break;  // 跳出循環(解析 QXmlStreamReader::EndDocument)
            } else if (QString::compare(strElementName, "Blog") == 0) {
                qDebug() << QString::fromLocal8Bit("********** 結束元素 ********** ");
            }
        }
    }
}
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved