Qt 讀取XML文檔的簡單示例

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();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章