Qt中使用DOM解析XML

介紹

在Qt中提供了QtXml模塊實現了對XML數據的處理,咱們在Qt幫助中輸入關鍵字QtXml Module,能夠看到該模塊的類表。在這裏咱們能夠看到全部相關的類,它們主要是服務於兩種操做XML文檔的方法:DOM和SAX。 Dom(Document Object Model,即文檔對象模型)把XML文檔轉換成應用程序能夠遍歷的樹形結構,這樣即可以隨機訪問其中的節點。它的缺點是須要將整個XML文檔讀入內存, 消耗內存較多。除了上面的兩種方法外,Qt還提供了簡單的QXmlStreamReader和QXmlStreamWriter對XML文檔進行讀寫,下 面咱們先介紹使用DOM的方式來操做XML文檔。 node

規範的XML文檔

<?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

相關文章
相關標籤/搜索