Как преобразовать данные узла xml в строку в QT

У меня есть XML-файл на моем локальном компьютере. Формат файла XML выглядит так:

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

Я хочу преобразовать данные этого файла XML в формат String. Подобно:

Sanket 0987654321 India Rahul 0987654321 Maharashtra

Какой самый простой способ конвертировать эти данные в QT, используя C++. Я новичок в этом, поэтому, пожалуйста, кто-нибудь может предложить мне пример кода для этого? Заранее спасибо.

Я попытался следующий код, но это не работает для меня:

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";
}
}

3 ответа

Вы могли бы сначала проанализировать элементы xml через QXmlStreamReader а затем вы можете собрать элементы XML в строку, как вы хотите.

Проблема вашего кода заключается в том, что вы обрабатываете только текстовые строки без какого-либо синтаксиса XML, обработанного классом XML.

Вы должны взглянуть на классы QtXML, для которых Florent Uguet предоставил несколько ссылок.

Однако я изменил пример, найденный здесь, чтобы сделать то, что вы хотите (он делает именно эту вещь для вашего точного ввода):

#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;
}

Я создаю его с помощью QtCreator, используя qmake. Для этого вы должны знать, что вам нужно поставить QT += xml в вашем *.pro файле.

Уже спросил (и с кодом): чтение XML-файла с использованием QXmlStreamReader

Qt предоставляет набор классов для обработки 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

Старые классы C++ (не поддерживаются)

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

После того, как вы проанализировали свой файл, используя их, вы обычно можете прочитать внутренний текст или атрибуты отдельных узлов.

Другие вопросы по тегам