#xml #qt #qt5
#xml #qt #qt5
Вопрос:
Я столкнулся с очень странной проблемой. Я не могу правильно прочитать атрибут узла xml с QXmlStreamReader
помощью в одном случае — чтения узла строки ip.
Ниже приведен мой XML-файл test.xml
<?xml version="1.0" encoding="UTF-8"?>
<Document>
<ip type="UiParamElem">192.168.1.100</ip>
</Document>
Я хочу прочитать значение ip
узла и его атрибут, следующие коды могут воспроизвести эту проблему:
#include <QCoreApplication>
#include <QFile>
#include <QXmlStreamReader>
#include <iostream>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFile xml("test.xml");
QXmlStreamReader xmlReader(amp;xml);
if(!xml.open(QIODevice::ReadOnly | QFile::Text))
return -1;
// get project root
while(!xmlReader.atEnd())
{
if (xmlReader.isStartElement())
{
std::cout << "start element name " << xmlReader.name().toString().toStdString() << std::endl;
if (xmlReader.name() == "ip")
{
QString ip = xmlReader.name().toString();
auto typevalue = xmlReader.attributes().value("type");
QString ipValue = xmlReader.readElementText();
std::cout << "ip value " << ipValue.toStdString()
<< " typevalue " << typevalue.toString().toStdString() << std::endl;
}
else
{
xmlReader.readNext();
}
}
else
{
xmlReader.readNext();
}
}
return a.exec();
}
И неожиданный результат выглядит следующим образом, чего не ожидается — атрибут неверен:
start element name Document
start element name ip
ip value 192.168.1.100 typevalue 100ramElem
Что это 100ramElem
за часть? Но UiParamElem
ожидается.
Ответ №1:
Вам необходимо преобразовать QStringRef в QString, возвращаемый значением («тип»). Согласно документам Qt, QStringRef предоставляет подмножество QString API, доступное только для чтения. Вызов toString() возвращает копию данных как реальный экземпляр QString.
auto typevalue = xmlReader.attributes().value("type").toString();
Комментарии:
1. Я сомневаюсь в этом. Потому что из моего выходного журнала, созданного по
std::cout
строке,typevalue
был преобразован в строку, и результат по-прежнему неверен.