編輯:關於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("********** 結束元素 ********** ");
}
}
}
}
Android簡易實戰教程--第四話《最簡單的短信發送器》
首先配置一個布局: 然後在activity中把發短信的代碼寫出來: package com.ydl.smssender;i
Android基礎筆記- 圖形、解決大圖OOM、繪畫工具的使用和練習
計算機圖形表示的原理 加載大圖出現OOM 縮放加載大的圖片資源 創建一個原圖的副本 圖形處理的常用的API 傻瓜版美圖秀秀 畫畫版計算機圖形表示的原理首先要明確的一點是,
Android Studio 打印調試信息
之前開發單片機軟件還是上位機都習慣使用printf(),相信很多很會有和我一樣的習慣。開始學習安卓了,當然也很在意安卓的這個打印調試應該怎麼做呢?這裡使用的是日志記錄中添
Android圖解淺析事件攔截機制
當Android系統捕獲到用戶的各種輸入事件後,如何准確的傳遞給真正的需要這個事件的控件?Android提供了一整套完善的事件傳遞、處理機制,來幫助開發者完成准確的事件分