Как преобразовать данные узла 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
После того, как вы проанализировали свой файл, используя их, вы обычно можете прочитать внутренний текст или атрибуты отдельных узлов.