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