XML簡介
XML(Extensible Markup Language,可擴展標記語言)是一種類似於HTML的標記語言,設計的目的是傳輸數據,而不是顯示數據。
XML的標籤沒有被預定義,用戶需要在使用時自定義。
XML使用的樹形結構更能表現出數據的包含關係。
XML是一種文本文件格式,在信息存儲和描述領域非常流行。
Qt 操作XML文檔一般方法
Qt提供了QtXML模塊來進行XML文檔的處理,這裏提供了3種解析方法:
-
DOM方法,可以進行讀和寫
-
SAX方法,可以進行讀取
-
基於流的方法,QXmlStreamReader和QXmlStreamWriter進行讀取和寫入。
Qt提供了更高級的QtXmlPatterns來進行XML數據的查詢和操作。支持XQuery1.0和XPath2.0
使用DOM讀取XML文檔
DOM(Document Object Model,文檔對象模型),提供了一個接口來訪問和改變一個XML文件的內容和結構,可以將XML文檔表示爲一個存儲在內存中具有層次的樹形圖。
文檔本身由QDOMDocument對象來表示,文檔中所有的DOM節點都是QDomNode類的子類。
Qt中使用QDomProcessingInstruction 類來表示XML說明。
XML文檔內容有多個元素組成。元素對應QDomElement類。
元素可以包含屬性。屬性對應QDomAttr類。
元素可以包含子元素,也可以只包含文本內容,文本內容由QDomText類表示。
所有的DOM節點,比如說明、元素、屬性、文本等都使用QDomNode來表示,然後使用對應的isProcessingInstruction()、isElement()、isAttr()和isText()等函數來判斷是否是該類型的元素。如果是,就可以使用toProcessingInstruction()、toElement()、toAttribute()、toText()等函數轉化爲具體的節點類型。
讀取XML文檔的一般步驟
1、打開 XML文件
2、新建QDomDocument 對象,將此對象命名,如命名爲 doc
3、將文件內容讀取到doc 中
4、關閉文件
5、對doc 進行操作
示例代碼:讀取XML文檔
1、.pro 添加QT += XML
2、#include<QXml>
代碼示例:
#include <QtCore/QCoreApplication>
#include <QtXml>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 新建QDomDocument類對象,它代表一個XML文檔
QDomDocument doc;
QFile file("../myDOM1/my.xml");
if (!file.open(QIODevice::ReadOnly)) return 0;
// 將文件內容讀到doc中
if (!doc.setContent(&file)) {
file.close();
return 0;
}
// 關閉文件
file.close();
// 獲得doc的第一個結點,即XML說明
QDomNode firstNode = doc.firstChild();
// 輸出XML說明,nodeName()爲“xml”,nodeValue()爲版本和編碼信息
qDebug() << qPrintable(firstNode.nodeName())
<< qPrintable(firstNode.nodeValue());
// 返回根元素
QDomElement docElem = doc.documentElement();
// 返回根節點的第一個子結點
QDomNode n = docElem.firstChild();
// 如果結點不爲空,則轉到下一個節點
while(!n.isNull())
{
// 如果結點是元素
if (n.isElement())
{
// 將其轉換爲元素
QDomElement e = n.toElement();
// 返回元素標記和id屬性的值
qDebug() << qPrintable(e.tagName())
<< qPrintable(e.attribute("id"));
// 獲得元素e的所有子結點的列表
QDomNodeList list = e.childNodes();
// 遍歷該列表
for(int i=0; i<list.count(); i++)
{
QDomNode node = list.at(i);
if(node.isElement())
qDebug() << " "<< qPrintable(node.toElement().tagName())
<<qPrintable(node.toElement().text());
}
}
// 轉到下一個兄弟結點
n = n.nextSibling();
}
return a.exec();
}