日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

[Qt教程] 第30篇 XML(四)使用流读写XML

發(fā)布時(shí)間:2024/4/20 asp.net 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Qt教程] 第30篇 XML(四)使用流读写XML 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

[Qt教程]?第30篇 XML(四)使用流讀寫XML

樓主 ?發(fā)表于 2013-5-22 13:03:33?|?查看: 611|?回復(fù): 0
使用流讀寫XML
版權(quán)聲明
該文章原創(chuàng)于作者yafeilinux,轉(zhuǎn)載請(qǐng)注明出處!

導(dǎo)語
? ?? ??Qt 4.3開始引入了兩個(gè)新的類來讀取和寫入XML文檔:QXmlStreamReaderQXmlStreamWriter?QXmlStreamReader類提供了一個(gè)快速的解析器通過一個(gè)簡(jiǎn)單的流API來讀取格式良好的XML文檔,它是作為QtSAX解析器的替代品的身份出現(xiàn)的,因?yàn)樗?/span>SAX解析器更快更方便。QXmlStreamReader可以從QIODevice或者QByteArray中讀取數(shù)據(jù)。流讀取器的基本原理就是將XML文檔報(bào)告為一個(gè)記號(hào)(tokens)流,這一點(diǎn)與SAX相似,而它們的不同之處在于XML記號(hào)被報(bào)告的方式。在SAX中,應(yīng)用程序必須提供處理器(回調(diào)函數(shù))來從解析器獲得所謂的XML事件;而對(duì)于QXmlStreamReader,是應(yīng)用程序代碼自身來驅(qū)動(dòng)循環(huán),在需要的時(shí)候可以從讀取器中一個(gè)接一個(gè)的拉出記號(hào)。這個(gè)是通過調(diào)用readNext()函數(shù)實(shí)現(xiàn)的,它可以讀取下一個(gè)記號(hào),然后返回一個(gè)記號(hào)類型,然后可以使用isStartElement()text()等函數(shù)來判斷這個(gè)記號(hào)是否包含我們需要的信息。使用這種主動(dòng)拉取記號(hào)的方式的最大的好處就是可以構(gòu)建遞歸解析器,也就是可以在不同的函數(shù)或者類中來處理XML文檔中的不同記號(hào)。

環(huán)境:Windows Xp + Qt 4.8.4+Qt Creator2.6.2

目錄
一、解析XML文檔 二、寫入XML文檔


正文

一、解析XML文檔
1.新建Qt控制臺(tái)應(yīng)用,項(xiàng)目名稱為myXmlStream,完成后將myXmlStream.pro文件的第一行代碼更改為: QT? ?? ??+= core??xml 然后保存該文件。
2.然后打開main.cpp文件,將內(nèi)容更改如下:
  • #include <QCoreApplication>
  • #include <QFile>
  • #include <QXmlStreamReader>
  • #include <QXmlStreamWriter>
  • #include <QDebug>

  • int main(int argc, char *argv[])
  • {
  • ? ? QCoreApplication a(argc, argv);
  • ? ? QFile file("../myXmlStream/my.xml");
  • ? ? if (!file.open(QFile::ReadOnly | QFile::Text))
  • ? ? {
  • ? ?? ???qDebug()<<"Error: cannot open file";
  • ? ?? ???return 1;
  • ? ? }
  • ? ??
  • ? ? QXmlStreamReader reader;
  • ? ??
  • ? ? // 設(shè)置文件,這時(shí)會(huì)將流設(shè)置為初始狀態(tài)
  • ? ? reader.setDevice(&file);
  • ? ??
  • ? ? // 如果沒有讀到文檔結(jié)尾,而且沒有出現(xiàn)錯(cuò)誤
  • ? ? while (!reader.atEnd()) {
  • ? ?? ???// 讀取下一個(gè)記號(hào),它返回記號(hào)的類型
  • ? ?? ???QXmlStreamReader::TokenType type = reader.readNext();
  • ? ?? ???
  • ? ?? ???// 下面便根據(jù)記號(hào)的類型來進(jìn)行不同的輸出
  • ? ?? ???if (type == QXmlStreamReader::StartDocument)
  • ? ?? ?? ?? ?qDebug() << reader.documentEncoding()?
  • ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? << reader.documentVersion();
  • ? ?? ???if (type == QXmlStreamReader::StartElement) {
  • ? ?? ?? ?? ?qDebug() << "<" << reader.name() << ">";
  • ? ?? ?? ?? ?if (reader.attributes().hasAttribute("id"))
  • ? ?? ?? ?? ?? ? qDebug() << reader.attributes().value("id");
  • ? ?? ???}
  • ? ?? ???if (type == QXmlStreamReader::EndElement)
  • ? ?? ?? ?? ?qDebug() << "</" << reader.name() << ">";
  • ? ?? ???if (type == QXmlStreamReader::Characters
  • ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? && !reader.isWhitespace())
  • ? ?? ?? ?? ?qDebug() << reader.text();
  • ? ? }
  • ? ??
  • ? ? // 如果讀取過程中出現(xiàn)錯(cuò)誤,那么輸出錯(cuò)誤信息
  • ? ? if (reader.hasError()) {
  • ? ?? ???qDebug() << "error: " << reader.errorString();
  • ? ? }
  • ? ??
  • ? ? file.close();
  • ? ??
  • ? ? return a.exec();
  • }
  • 復(fù)制代碼 可以看到流讀取器就是在一個(gè)循環(huán)中通過使用readNext()來不斷讀取記號(hào)的,這里可以對(duì)不同的記號(hào)和不同的內(nèi)容進(jìn)行不同的處理,既可以在本函數(shù)中進(jìn)行,也可以在其他函數(shù)或者其他類中進(jìn)行。可以將前面生成的my.xml文件復(fù)制到源碼目錄,然后運(yùn)行程序,查看效果。



    二、寫入XML文檔

    與QXmlStreamReader對(duì)應(yīng)的是QXmlStreamWriter,它通過一個(gè)簡(jiǎn)單的流API提供了一個(gè)XML寫入器。QXmlStreamWriter的使用是十分簡(jiǎn)單的,只需要調(diào)用相應(yīng)的記號(hào)的寫入函數(shù)來寫入相關(guān)數(shù)據(jù)即可。
    將前面主函數(shù)的內(nèi)容更改為: int?main(int?argc,?char?*argv[]) { ? ??QCoreApplication?a(argc,?argv); ? ??QFile?file("../myXmlStream/my2.xml"); ? ??if?(!file.open(QFile::WriteOnly?|?QFile::Text)) ? ??{ ? ?? ??qDebug()?<<?"Error: cannot open file"; ? ?? ??return?1; ? ??} ? ??QXmlStreamWriter?stream(&file); ? ??stream.setAutoFormatting(true); ? ??stream.writeStartDocument(); ? ??stream.writeStartElement("bookmark"); ? ??stream.writeAttribute("href",?"http://qt.nokia.com/"); ? ??stream.writeTextElement("title",?"Qt Home"); ? ??stream.writeEndElement(); ? ??stream.writeEndDocument(); ? ??file.close(); ? ??qDebug()?<<?"write finished!"; ? ??return?a.exec(); }
    這里使用了setAutoFormatting(true)函數(shù)來自動(dòng)設(shè)置格式,這樣會(huì)自動(dòng)換行和添加縮進(jìn)。然后使用了writeStartDocument(),該函數(shù)會(huì)自動(dòng)添加首行的XML說明(即<?xmlversion="1.0" encoding="UTF-8"?>),添加元素可以使用writeStartElement(),不過,這里要注意,一定要在元素的屬性、文本等添加完成后,使用writeTextElement()來關(guān)閉前一個(gè)打開的元素。在最后使用writeEndDocument()來完成文檔的寫入。現(xiàn)在大家可以運(yùn)行程序了,這時(shí)會(huì)在項(xiàng)目目錄中生成一個(gè)XML文檔。


    結(jié)語
    數(shù)據(jù)庫和XML在很多程序中都經(jīng)常用到,它們的使用也總是和數(shù)據(jù)的顯示聯(lián)系起來,所以學(xué)習(xí)好數(shù)據(jù)庫的知識(shí)也是很重要的,它們可以說是密不可分的。相關(guān)內(nèi)容,大家也可以參考《Qt Creator快速入門》的相關(guān)章節(jié)以及《Qt 及Qt Quick開發(fā)實(shí)戰(zhàn)精解》的數(shù)據(jù)管理系統(tǒng)的例子,里面同時(shí)應(yīng)用了數(shù)據(jù)庫和XML。



    涉及到的源碼:??myXmlStream.zip?(1.78 KB, 下載次數(shù): 14)?

    總結(jié)

    以上是生活随笔為你收集整理的[Qt教程] 第30篇 XML(四)使用流读写XML的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。