Ошибка чтения атрибута xml с помощью QXmlStreamReader в QT

#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 был преобразован в строку, и результат по-прежнему неверен.