QDomDocument

Qt解析XML文件(QDomDocument)

(2013-08-02 22:25:27)

轉載

標籤:

qt

qt解析xml

qtxml

qdomdocument

分類: Qt

    關於XML及其使用場景不在此多做介紹,今天主要介紹Qt中對於XML的解析。QtXml模塊提供了一個讀寫XML文件的流,解析方法包含DOM和SAX,兩者的區別是什麼呢?

DOM(Document Object Model):將XML文件保存爲樹的形式,操作簡單,便於訪問。

SAX(Simple API for XML):接近於底層,速度較快,但不便於訪問。

 

如果要使用XML時,需添加下行代碼:

    #include

並在.pro文件中添加:

    QT += xml

   

Note that QXmlStream* classes are in QtCore,這句話是說QXmlStreamReader和QXmlStreamWriter不在模塊QtXml中,而是在QtCore中,該模塊只涉及DOM和SAX基於XML的接口。

 

此模塊中包含的類不再多作介紹,詳情請查看:http://qt-project.org/doc/qt-4.8/qtxml.html

 

例子:

 

person.xml文件如下所示:

Qt解析XML文件(QDomDocument)

解析方法:

void ParseXML::parse(QString file_name)  

{  

    if(file_name.isEmpty())  

        return;  

  

    QFile file(file_name);  

    if(!file.open(QFile::ReadOnly | QFile::Text))

    {  

        QMessageBox::information(NULL, QString("title"), QString("open error!"));

 

        return;  

    }  

  

    QDomDocument document;  

    QString error;  

    int row = 0, column = 0;  

    if(!document.setContent(&file, false, &error, &row, &column))

    {  

        QMessageBox::information(NULL, QString("title"), QString("parse file failed at line row and column") + QString::number(row, 10) + QString(",") + QString::number(column, 10));

 

        return;  

    }  

  

    if(document.isNull())

    {  

        QMessageBox::information(NULL, QString("title"), QString("document is null!"));

        

        return;  

    }  

  

    QDomElement root = document.documentElement();  

 

    //root_tag_name爲persons

    QString root_tag_name = root.tagName();

    if(root.hasAttribute("name"))

    {

        //name爲Qt

        QString name = root.attributeNode("name").value(); 

    }

       

    //獲取id="1"的節點

    QDomElement person = root.firstChildElement();  

    if(person.isNull()) 

        return; 

 

    QString person_tag_name = person.tagName();

 

    //id爲1

    QString id = person.attributeNode("id").value();

 

    //獲取子節點,數目爲2

    QDomNodeList list = root.childNodes();

    int count = list.count();

    for(int i=0; i

    {

        QDomNode dom_node = list.item(i);

        QDomElement element = dom_node.toElement();

 

        //獲取id值,等價

        QString id_1 = element.attributeNode("id").value(); 

        QString id_2 = element.attribute("id");

 

        //獲取子節點,數目爲4,包括:name、age、email、website

        QDomNodeList child_list = element.childNodes();

        int child_count = child_list.count();

        for(int j=0; j

        {

            QDomNode child_dom_node = child_list.item(j);

            QDomElement child_element = child_dom_node.toElement();

            QString child_tag_name = child_element.tagName();

            QString child__tag_value = child_element.text();

        }

    }

 

    //按照name、age、email、website的順序獲取值

    QDomElement element = person.firstChildElement();  

    while(!element.isNull())

    {  

        QString tag_name = element.tagName();

        QString tag_value = element.text();

        element = element.nextSiblingElement();  

    }  

}  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章