【Qt】DOM读取XML文档
00. 目錄
文章目錄
- 00. 目錄
- 01. 概述
- 02. 開發環境
- 03. XML文檔示例
- 04. DOM讀取XML文檔內容
- 05. 預留
- 06. 附錄
01. 概述
DOM(Document Object Model,文檔對象模型),是W3C的推薦標準。它提供了一個接口來訪問和改變一個XML文件的內容和結構,可以將XML文檔表示為一個存儲在內存中具有層次的樹視圖。文檔本身由QDomDocument對象來表示,而文檔樹中所有的DOM節點都是QDomNode類的子類。
在Qt中使用QDomProcessingInstruction類來表示XML說明。元素對應QDomElement類。屬性對應QDomAttr類。文本內容由QDomText類表示。所有的DOM節點,比如這里的說明、元素、屬性和文本等,都使用QDomNode來表示。
元素對應QDomElement 類。元素可以包含屬性,用來描述元素的相關信息,屬性名和屬性值在元素的起始標簽中給出。
屬性值必須在單引號或者雙引號中。屬性對應QDomAttr 類。
元素中可以包含子元素,也可以只包含文本內容,比如這里<first-name> Mary </first-name>中的Mary就是文本內容,文本內容由QDomText 類表示。
XML(ExtensibleMarkup Language,可擴展標記語言),是一種類似于HTML的標記語言,但它的設計目的是用來傳輸數據,而不是顯示數據。XML的標簽沒有被預定義,用戶需要在使用時自行進行定義。XML是W3C(萬維網聯盟)的推薦標準。相對于數據庫表格的二維表示,XML使用的樹形結構更能表現出數據的包含關系,作為一種文本文件格式,XML簡單明了的特性使得它在信息存儲和描述領域非常流行。
? 在Qt中提供了Qt XML模塊來進行XML文檔的處理,這里主要提供了兩種解析方法: DOM方法,可以進行讀寫;SAX方法,可以進行讀取。從Qt 5開始,Qt XML模塊不再進行維護,而是推薦使用Qt Core模塊中基于流的方法,分別使用QXmlStreamReader和QXmlStreamWriter進行讀取和寫入。本文檔先來講解一下DOM的方法。要在項目中使用Qt XML模塊,需要在項目文件(.pro文件)中添加QT += xml一行代碼。
02. 開發環境
Windows系統:Windows10
Qt版本:Qt5.15、Qt6
03. XML文檔示例
規范的XML文檔如下所示:
<?xml version="1.0"encoding="UTF-8"?> <library><book id="01"><title>Qt</title><author>LiMing</author></book><book id="02"><title>Linux</title><author>ZhengGang</author></book> </library>每個XML文檔都由XML說明(或者稱為XML序言)開始,它是對XML文檔處理的環境和要求的說明,比如這里的,其中xml version=“1.0”,表明使用的XML版本號,這里字母是區分大小寫的;encoding=“UTF-8”是使用的編碼,指出文檔是使用何種字符集建立的,默認值為Unicode編碼。XML文檔內容由多個元素組成,一個元素由起始標簽<標簽名>和終止標簽以及兩個標簽之間的內容組成,而文檔中第一個元素被稱為根元素,比如這里的,XML文檔必須有且只有一個根元素。元素的名稱是區分大小寫的,元素還可以嵌套,比如這里的library、book、title和author等都是元素。元素可以包含屬性,用來描述元素的相關信息,屬性名和屬性值在元素的起始標簽中給出,格式為<元素名 屬性名=“屬性值”>,如,屬性值必須在單引號或者雙引號中。在元素中可以包含子元素,也可以只包含文本內容,比如這里的中的Qt就是文本內容。
04. DOM讀取XML文檔內容
Dom(Document Object Model,即文檔對象模型)把XML文檔轉換成應用程序可以遍歷的樹形結構,這樣便可以隨機訪問其中的節點。它的缺點是需要將整個XML文檔讀入內存,消耗內存較多。
在Qt中使用QDomProcessingInstruction類來表示XML說明,元素對應QDomElement類,屬性對應QDomAttr類,文本內容由QDomText類表示。所有的DOM節點,比如這里的說明、元素、屬性和文本等,都使用QDomNode來表示,然后使用對應的isProcessingInstruction()、isElement()、isAttr()和isText()等函數來判斷是否是該類型的元素,如果是,那么就可以使用toProcessingInstruction()、toElement()、toAttr()和toText()等函數轉換為具體的節點類型。
4.1 新建Qt控制臺應用QtConsole Application,項目名稱為16XML。
4.2 在16XML.pro配置文件中添加下一行
QT += xml4.3 main.cpp內容如下
int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);//新建QDomDocument類對象 代表一個XML文檔QDomDocument doc;//創建test.xml文件QFile file("../test.xml");//以只讀方式打開該文件bool ret = file.open(QIODevice::ReadOnly);if (!ret){qDebug() << "打開文件失敗";file.close();return 1;}//將文件內容讀到doc中ret = doc.setContent(&file);if (!ret){qDebug() << "設置內容失敗";file.close();return 1;}file.close();//獲取doc第一個節點 即XML說明QDomNode firstNode = doc.firstChild();//輸出XML說明qDebug() << firstNode.nodeName() << firstNode.nodeValue();return 0;//return a.exec(); }執行結果
“xml” “version=‘1.0’ encoding=‘UTF-8’”
不愿意看到字符串兩邊的引號,可以將源碼中得qDebug()語句更改如下:
//輸出XML說明//qDebug() << firstNode.nodeName() << firstNode.nodeValue();qDebug() << qPrintable(firstNode.nodeName())<< qPrintable(firstNode.nodeValue());執行結果
xml version='1.0' encoding='UTF-8'4.4 繼續修改main.cpp文件內容如下:
#include <QCoreApplication> #include <QDebug> #include <QDomDocument> #include <QDomNode> #include <QtXml> #include <QFile>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);//新建QDomDocument類對象 代表一個XML文檔QDomDocument doc;//創建test.xml文件QFile file("../test.xml");//以只讀方式打開該文件bool ret = file.open(QIODevice::ReadOnly);if (!ret){qDebug() << "打開文件失敗";file.close();return 1;}//將文件內容讀到doc中ret = doc.setContent(&file);if (!ret){qDebug() << "設置內容失敗";file.close();return 1;}file.close();//獲取doc第一個節點 即XML說明QDomNode firstNode = doc.firstChild();//輸出XML說明//qDebug() << firstNode.nodeName() << firstNode.nodeValue();qDebug() << qPrintable(firstNode.nodeName())<< qPrintable(firstNode.nodeValue());//返回根元素QDomElement docElem = doc.documentElement();//返回根節點的第一個子節點QDomNode root = docElem.firstChild();while(!root.isNull()){//如果節點是元素if (root.isElement()){//將其轉換為元素QDomElement e = root.toElement();//返回元素的標記 和id屬性的值qDebug() << qPrintable(e.tagName())<< qPrintable(e.attribute("id"));}//下一個兄弟節點root = root.nextSibling();}return 0;//return a.exec(); }執行結果如下:
xml version='1.0' encoding='UTF-8' book 01 book 024.5 繼續修改main.cpp文件,得到所有節點
#include <QCoreApplication> #include <QDebug> #include <QDomDocument> #include <QDomNode> #include <QtXml> #include <QFile>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);//新建QDomDocument類對象 代表一個XML文檔QDomDocument doc;//創建test.xml文件QFile file("../test.xml");//以只讀方式打開該文件bool ret = file.open(QIODevice::ReadOnly);if (!ret){qDebug() << "打開文件失敗";file.close();return 1;}//將文件內容讀到doc中ret = doc.setContent(&file);if (!ret){qDebug() << "設置內容失敗";file.close();return 1;}file.close();//獲取doc第一個節點 即XML說明QDomNode firstNode = doc.firstChild();//輸出XML說明//qDebug() << firstNode.nodeName() << firstNode.nodeValue();qDebug() << qPrintable(firstNode.nodeName())<< qPrintable(firstNode.nodeValue());//返回根元素QDomElement docElem = doc.documentElement();//返回根節點的第一個子節點QDomNode root = docElem.firstChild();while(!root.isNull()){//如果節點是元素if (root.isElement()){//將其轉換為元素QDomElement e = root.toElement();//返回元素的標記 和id屬性的值qDebug() << qPrintable(e.tagName())<< qPrintable(e.attribute("id"));//獲取元素e的所有子節點的列表QDomNodeList list = e.childNodes();//遍歷該列表for (int i = 0; i < list.size(); i++){QDomNode node = list.at(i);if (node.isElement()){qDebug() << " " << qPrintable(node.toElement().tagName())<< qPrintable(node.toElement().text());}}}//下一個兄弟節點root = root.nextSibling();}return 0;//return a.exec(); }使用了childNodes()函數獲得了元素所有子節點的列表,然后通過遍歷這個列表實現了遍歷其所有子元素。 執行結果
xml version='1.0' encoding='UTF-8' book 01title Qtauthor LiMing book 02title Linuxauthor ZhengGang05. 預留
06. 附錄
6.1 Qt教程匯總
網址:https://dengjin.blog.csdn.net/article/details/115174639
6.2 源碼下載
網址:【Qt】DOM讀取XML文檔.rar
總結
以上是生活随笔為你收集整理的【Qt】DOM读取XML文档的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Qt】XML简介
- 下一篇: 【Qt】DOM创建和操作XML文档