sanket karanjule
sanket karanjule

Reputation: 37

How to convert xml node data into string in QT

I have xml file in my local machine. The xml file format is like:

<string>
        <Data>
              <Name>Sanket</Name>
              <Number>0987654321</Number>
              <Address>India</Address>
        </Data>
        <Data>
              <Name>Rahul</Name>
              <Number>0987654321</Number>
              <Address>Maharashtra</Address>
        </Data>
</string>

I want to convert this XML file data into String format. Like:

Sanket 0987654321 India Rahul 0987654321 Maharashtra

What is the easiest way to convert this data in QT using c++. I am new in that, so please can anyone suggest me some sample code for this? Thank you in advance.

I tried following code, but that not work for me:

void parseFile()
{
QList<QList<QString> > dataSet;

QString lastError = "";
QFile inFile("test.xml");
if (inFile.open(QIODevice::ReadOnly))
{
    QTextStream fread(&inFile);
    long totalSize = inFile.size();
    QString line;
    while(!fread.atEnd())
    {
        line = fread.readLine();
        QList<QString> record = line.split(QString::KeepEmptyParts);
        dataSet.append(record);

    }
     qDebug()<<dataSet;
}else{
    lastError = "Could not open "+test.xml+" for reading";
}
}

Upvotes: 0

Views: 1605

Answers (3)

Elcan
Elcan

Reputation: 824

Already asked (and with code) : Reading an XML file using QXmlStreamReader

Qt provides a set of classes for handling XML :

http://doc.qt.io/qt-5.7/qtxml-index.html

http://doc.qt.io/qt-5.7/qxmlstreamreader.html

http://doc.qt.io/qt-5.7/qxmlstreamwriter.html

Old C++ classes (not maintained)

http://doc.qt.io/qt-5/qtxml-module.html

Once you have parsed your file using these, you can usually read the individual nodes' inner text or attributes.

Upvotes: 0

ab.o2c
ab.o2c

Reputation: 238

The problem of you Code is that you only process the text Lines without any xml-syntax processed by the xml class.

You should look at the QtXML classes for which Florent Uguet provided some links.

However I modified the example found here to do what you want (It does that exact thing for your exact input):

#include <QDomDocument>
#include <QFile>
#include <iostream>
#include <QDomNodeList>

int main()
{
    QDomDocument doc("mydocument");
    QFile file("test.xml");
    if (!file.open(QIODevice::ReadOnly))
        return 1;
    if (!doc.setContent(&file)) {
        file.close();
        return 1;
    }
    file.close();

    const auto stringTags = doc.elementsByTagName("string");

    for(int stringsI = 0; stringsI < stringTags.size(); ++stringsI){
        QDomNode stringTag = stringTags.at(stringsI);
        for(QDomNode dataTag = stringTag.firstChildElement("Data");   !dataTag.isNull(); dataTag = dataTag.nextSiblingElement("Data")){
            for(QDomNode innerTag = dataTag.firstChild(); !innerTag.isNull(); innerTag = innerTag.nextSibling()){
                auto val = innerTag.toElement().text();
                std::cout << val.toStdString() << "    ";
            }
            std::cout << std::endl;
        }
    }

    return 0;
}

I build it with QtCreator using qmake. For this you should know that you need to put QT += xml in your *.pro file.

Upvotes: 0

Andy
Andy

Reputation: 11

You could parse the xml elements firstly via QXmlStreamReader and then you can assemble the xml elements into the string how you want.

Upvotes: 1

Related Questions