Qt解析XML文件(QDomDocument)

轉載:http://blog.sina.com.cn/s/blog_a6fb6cc90101eugv.html
關於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();  
    }  
}  

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