【Qt】 XML流读写XML
00. 目錄
文章目錄
- 00. 目錄
- 01. 概述
- 02. 開發環境
- 03. 讀取XML文檔
- 04. 寫入XML文檔
- 05. 預留
- 06. 附錄
01. 概述
從Qt 4.3開始引入了兩個新的類來讀取和寫入XML文檔: QXmlStreamReader和QXmlStreamWriter。
QXmlStreamReader類提供了一個快速的解析器,通過一個簡單的流API來讀取格式良好的XML文檔,它是作為Qt的SAX解析器的替代品的身份出現的,因為它比SAX解析器更快更方便。流讀取器的基本原理就是將XML文檔報告為一個記號(tokens)流,應用程序代碼自身來驅動循環,在需要的時候可以從讀取器中一個接一個的拉出記號。這個是通過調用readNext()函數實現的,它可以讀取下一個記號,然后返回一個記號類型,它由QXmlStreamReader::TokenType定義,其所有取值如表所列。然后可以使用isStartElement()和text()等函數來判斷這個記號是否包含需要的信息。
與QXmlStreamReader對應的是QXmlStreamWriter,它通過一個簡單的流API提供了一個XML寫入器。QXmlStreamWriter的使用也是十分簡單的,只需要調用相應的記號的寫入函數來寫入相關數據即可。
XML流包含兩個部分QXmlStreamReader和和QXmlStreamWriter。 QXmlStream Reader 類提供了一個快速的解析器.它通過一個簡單的流API 來讀取格式良好的XML 文擋,它是作為Qt 的SAX 解析器的替代品身份出現的,因為它比SAX 解析器更快更方便。
在SAX 中,應用程序必須提供處理器(回調函數)來從解析器獲得所謂的XML 事件;而QXmlStreamReader是應用程序代碼向身來驅動循環,在需要的時候可以從讀取器中一個接一個地拉出記號。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-tauu8Hp2-1616769486826)(assets/image-20210326220914076.png)]
溫馨提示
在Qt6中,SAX解析方式已經不推薦使用,強烈建議使用QXmlStreamReader和QXmlStreamWriter代替。
02. 開發環境
Windows系統:Windows10
Qt版本:Qt5.15或者Qt6
03. 讀取XML文檔
3.1 新建Qt控制臺應用QtConsole Application,項目名稱為18XML,完成后將18XML.pro文件的第一行代碼更改為:
QT += xml3.2 在main.cpp文件,將內容更改如下:
#include <QCoreApplication>#include <QFile> #include <QXmlStreamReader> #include <QXmlStreamWriter> #include <QDebug>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QFile file("../18XML/test.xml");if (!file.open(QFile::ReadOnly | QFile::Text)){qDebug() << "Error: 打開文件失敗";return 1;}QXmlStreamReader reader;//設置文件 將流設置為初始狀態reader.setDevice(&file);//如果沒有讀到文檔結尾 而且沒有出現錯誤while(!reader.atEnd()){//讀取下一個記號 它返回記號的類型QXmlStreamReader::TokenType type = reader.readNext();//下面根據記號的類型來進行不同的輸出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();}}//如果讀取中出現了錯誤 就輸出錯誤信息if (reader.hasError()){qDebug() << "error: " << reader.errorString();}file.close();return a.exec(); }可以看到流讀取器就是在一個循環中通過使用readNext()來不斷讀取記號的,這里可以對不同的記號和不同的內容進行不同的處理,既可以在本函數中進行,也可以在其他函數或者其他類中進行。運行程序,查看效果。
"UTF-8" "1.0" < "library" > < "book" > "01" < "title" > "Qt" </ "title" > < "author" > "LiMing" </ "author" > </ "book" > < "book" > "02" < "title" > "Linux" </ "title" > < "author" > "ZhengGang" </ "author" > </ "book" > </ "library" >04. 寫入XML文檔
與QXmlStreamReader對應的是QXmlStreamWriter,它通過一個簡單的流API提供了一個XML 寫人器。QXmlStreamWriter的使用也十分簡單,只需要調用相應記號的寫入函數來寫入相關數據即可。
#include <QCoreApplication>#include <QFile> #include <QXmlStreamReader> #include <QXmlStreamWriter> #include <QDebug>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QFile file("../18XML/test2.xml");if (!file.open(QFile::WriteOnly | QFile::Text)){qDebug() << "Error: 打開文件失敗";return 1;}QXmlStreamWriter writer(&file);writer.setAutoFormatting(true);writer.writeStartDocument();writer.writeStartElement("bookmark");writer.writeAttribute("href", "http://www.qt.io");writer.writeTextElement("title", "Qt Home");writer.writeEndElement();writer.writeEndDocument();//關閉文件file.close();qDebug() << "Write Finished";return a.exec(); }執行結果 test2.xml文件內容如下:
<?xml version="1.0" encoding="UTF-8"?> <bookmark href="http://www.qt.io"> <title>Qt Home</title> </bookmark>這里使用了setAutoFormatting(true)函數來自動設置格式,這樣會自動換行和添加縮進。然后使用了writeStartDocument(),該函數會自動添加首行的XML說明(即),添加元素可以使用writeStartElement(),不過,這里要注意,一定要在元素的屬性、文本等添加完成后,使用writeTextElement()來關閉前一個打開的元素。在最后使用writeEndDocument()來完成文檔的寫入。現在大家可以運行程序了,這時會在項目目錄中生成一個XML文檔。
05. 預留
06. 附錄
6.1 Qt教程匯總
網址:https://dengjin.blog.csdn.net/article/details/115174639
6.2 源碼下載
網址:【Qt】 XML流讀寫XML.rar
總結
以上是生活随笔為你收集整理的【Qt】 XML流读写XML的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Qt】DOM创建和操作XML文档
- 下一篇: 【Qt】Qt工程管理