Qt中使用DOM解析XML文件或者字符串二(實例)


介紹

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

規范的XML文檔
<?xml version=”1.0″ encoding=”UTF-8″?> //XML說明
<library> //根元素
<book id=”01″> //library元素的第一個子元素,“id”是其屬性06
<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文檔,具體代碼如下:
view sourceprint?
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();


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM