Using QDomDocument to parse XML

From Qt Wiki
Jump to navigation Jump to search

Template:ArticleMetaData Template:FeaturedArticle

Overview[edit | edit source]

Template:Abstract

Preconditions[edit | edit source]

  • Download and install the Qt SDK

QDomDocument parsing Example[edit | edit source]

XML file[edit | edit source]

<?xml version="1.0" encoding="UTF-8" ?> <persons>

   <person id="1">
       <firstname>John</firstname>
       <surname>Doe</surname>
       <email>john.doe@example.com</email>
       <website>http://en.wikipedia.org/wiki/John_Doe</website>
   </person>
   <person id="2">
       <firstname>Jane</firstname>
       <surname>Doe</surname>
       <email>jane.doe@example.com</email>
       <website>http://en.wikipedia.org/wiki/John_Doe</website>
   </person>
   <person id="3">
       <firstname>Matti</firstname>
       <surname>Meikäläinen</surname>
       <email>matti.meikalainen@example.com</email>
       <website>http://fi.wikipedia.org/wiki/Matti_Meikäläinen</website>
   </person>

</persons>

Header file[edit | edit source]

class QXSRExample : public QMainWindow {

   Q_OBJECT

public:

   QXSRExample(QWidget *parent = 0);
   ~QXSRExample();

private slots:

   void parseXML();

private:

   QPointer<QVBoxLayout> _layout;
   void setupUI();
   void addPersonsToUI(QList< QMap<QString,QString> >& persons);

};

Source file[edit | edit source]

void QXSRExample::parseXML() {

   /* We'll parse the example.xml */
   QFile* file = new QFile("C://example.xml");
   /* If we can't open it, let's show an error message. */
   if (!file->open(QIODevice::ReadOnly | QIODevice::Text)) {
       QMessageBox::critical(this,
                             "QXSRExample::parseXML",
                             "Couldn't open example.xml",
                             QMessageBox::Ok);
       return;
   }
   
   QList< QMap<QString,QString> > persons;
   
   /* QDomDocument takes any QIODevice. as well as QString buffer*/
   QDomDocument doc("mydocument"); 
   if (!doc.setContent(file)) 
   {          
   	return;      

}

   //Get the root element
   QDomElement docElem = doc.documentElement(); 
   
   // you could check the root tag name here if it matters

QString rootTag = docElem.tagName(); // == persons

// get the node's interested in, this time only caring about person's QDomNodeList nodeList = docElem.elementsByTagName("person");

//Check each node one by one. for(int ii = 0;ii < nodeList.count(); ii++)

   {

QMap<QString, QString> person;

// get the current one as QDomElement

   	QDomElement el = nodeList.at(ii).toElement();
   	person["id"] = el.attribute("id"); // get and set the attribute ID
   	//get all data for the element, by looping through all child elements

QDomNode pEntries = el.firstChild();

       while(!pEntries.isNull()) {
       	QDomElement peData = pEntries.toElement();
       	QString tagNam = peData.tagName();
       	if(tagNam == "firstname") { /* We've found first name. */       			

person["firstname"] = peData.text();

       	}else if(tagNam == "surname") { /* We've found surname. */

person["surname"] = peData.text();

       	}else if(tagNam == "email") { /* We've found email. */

person["email"] = peData.text();

       	}else if(tagNam == "website") { /* We've found website. */

person["website"] = peData.text();

       	}
       	pEntries = pEntries.nextSibling();
       }
       
       persons.append(person);
    }
   
   this->addPersonsToUI(persons);

}

Postconditions[edit | edit source]

You are able to parse the XML and display it in the UI. File:QXSRExample.png

Supplementary material[edit | edit source]

  • You can test 76ytuiytuityutyutututyutyutyu with a test application. The application is available for download at File:QXMLDocExample.zip.

See also[edit | edit source]

QXmlStreamReader to parse XML in Qt