在Qt中提供了QtXml模塊實現了對XML數據的處理,咱們在Qt幫助中輸入關鍵字QtXml Module,能夠看到該模塊的類表。在這裏咱們能夠看到全部相關的類,它們主要是服務於兩種操做XML文檔的方法:DOM和SAX。 Dom(Document Object Model,即文檔對象模型)把XML文檔轉換成應用程序能夠遍歷的樹形結構,這樣即可以隨機訪問其中的節點。它的缺點是須要將整個XML文檔讀入內存, 消耗內存較多。除了上面的兩種方法外,Qt還提供了簡單的QXmlStreamReader和QXmlStreamWriter對XML文檔進行讀寫,下 面咱們先介紹使用DOM的方式來操做XML文檔。 node
<?xml version=」1.0″ encoding=」UTF-8″?> //XML說明 <library> //根元素 <book id=」01″> //library元素的第一個子元素,「id」是其屬性 <title>Qt</title> //book元素的子元素,「Qt」是元素的文本 <author>shiming</author> //book元素的子元素,title元素的兄弟元素 </book> //結束標記名 <book id=」02″> <title>Linux</title> <author>yafei</author> </book> </library>
能夠看到,一個規範的XML文檔,是用XML說明開始的,主要由各元素組成。XML文檔第一個元素就是根元素,XML文檔必須有且只有一個根元素。元素是能夠嵌套 函數
首先須要在工程文件中手動添加QT += xmL 接下來須要新建QDomDocument類對象,它表明一個XML文檔,具體代碼以下: spa
QDomDocument doc; //新建QDomDocument類對象,它表明一個XML文檔 QFile file(「my.xml」); //創建指向「my.xml」文件的QFile對象 if (!file.open(QIODevice::ReadOnly)) return 0; //以只讀方式打開 if (!doc.setContent(&file)) { file.close(); return 0; } //將文件內容讀到doc中 file.close();而後咱們解析各個接點,具體代碼以下:
QDomElement docElem = doc.documentElement(); //返回根元素 QDomNode n = docElem.firstChild(); //返回根節點的第一個子節點 while(!n.isNull()) { //若是節點不爲空 if (n.isElement()) //若是節點是元素 { QDomElement e = n.toElement(); //將其轉換爲元素 qDebug() << qPrintable(e.tagName()) //返回元素標記 << qPrintable(e.attribute(「id」)); //返回元素id屬性的值 QDomNodeList list = e.childNodes(); //得到元素e的全部子節點的列表 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(); //下一個兄弟節點 }
小結:經過上面的例子,咱們實現了對一個XML文檔的讀取。能夠看到,在QDom中,是將整個XML文件讀到內存中的doc對象中的。而後使用節點 (QDomNode )操做doc對象,像XML說明,元素,屬性,文本等等都被看作是節點,這樣就使得操做XML文檔變得很簡單,咱們只需經過轉換函數將節點轉換成相應的類 型,如QDomElement e = n.toElement(); code