c++ - 使用 QXmlStreamReader C/Qt 解析 XML 文件

标签 c++ xml qt parsing qxmlstreamreader

这是我的功能:

void mission::loadMission(QList < waypoint* > wpList , QString filename){

     QXmlStreamReader xmlReader;
      int i=0 ;
      QFile file(filename);

      if(file.open(QIODevice::ReadOnly)) {
      xmlReader.setDevice(&file);;
      xmlReader.readNext();
      xmlReader.readNext();
      bool ok = false ;

      //Reading from the file
      while (!xmlReader.isEndDocument())
      {
          if (xmlReader.isStartElement())
          {
              QString name = xmlReader.name().toString();
              if (name == "Number" )
              {
                  wpList[i]->setNum(xmlReader.readElementText().toInt(&ok,10));
              }

              else  if (name == "Longitude" )
              {
                  wpList[i]->setLong(xmlReader.readElementText().toDouble(&ok));
              }

              else  if (name == "Latitude" )
              {
                  wpList[i]->setLat(xmlReader.readElementText().toDouble(&ok));
              }

              else  if (name == "Altitude" )
              {
                  wpList[i]->setAlt(xmlReader.readElementText().toDouble(&ok));
              }

              else  if (name == "Heading" )
              {
                  wpList[i]->setHdg(xmlReader.readElementText().toDouble(&ok));
              }

              else  if (name == "Time" )
              {
                  wpList[i]->setTime(xmlReader.readElementText().toInt(&ok,10));
              }

              else  if (name == "Type" )
              {
                  wpList[i]->setType(xmlReader.readElementText().toInt(&ok,10));
              }

          }
          else if (xmlReader.isEndElement())
          {
              xmlReader.readNext();
              i++ ;
          }
      }
      if (xmlReader.hasError())
      {
          cout << "XML error: " << xmlReader.errorString().data() << std::endl;
      }

  }



}

这是我的 XML 文件的示例:

<?xml version="1.0" encoding="UTF-8"?>
<Mission>
    <Number>2013_7_11_16_28</Number>
    <Waypoint>
        <Number>0</Number>
        <Longitude>1.26946</Longitude>
        <Latitude>43.5147</Latitude>
        <Altitude>100</Altitude>
        <Heading>90</Heading>
        <Time>4400</Time>
        <Type>1</Type>
    </Waypoint>
    <Waypoint>
        <Number>1</Number>
        <Longitude>1.56958</Longitude>
        <Latitude>43.4721</Latitude>
        <Altitude>100</Altitude>
        <Heading>90</Heading>
        <Time>4400</Time>
        <Type>1</Type>
    </Waypoint>
    <Waypoint>
        <Number>2</Number>
        <Longitude>1.64424</Longitude>
        <Latitude>43.655</Latitude>
        <Altitude>100</Altitude>
        <Heading>90</Heading>
        <Time>4400</Time>
        <Type>1</Type>
    </Waypoint>
  </Mission>

最佳答案

我建议您继续使用常规 C++ 和 STL 进行工作/学习,然后在您更加熟练后转向 Qt。我注意到的一些事情是关于基本 C++ 编程的,实际上与 Qt 无关。

对于初学者来说,需要通过引用而不是通过值来传递。

 void mission::loadMission(QList<waypoint*> &wpList , QString filename){  
     // ...
 }

存储指针的 QList 可能没有什么好处。我也只需要 QList < waypoint> &。然后使用 QList::push_back() 方法填充列表,而不是尝试猜测索引列表的位置。

          void mission::loadMission(QList<waypoint> &wpList , QString filename){  
              // ...
              QStringRef name = xmlReader.name();
              if (name == "Waypoint" )
              {
                  waypoint wp;
                  wpList.push_back(wp);
              }
              if (name == "Number" )
              {
                  wpList.back().setNum(xmlReader.readElementText().toInt(&ok,10));
              }

也没有必要从 QStringRef 中复制一份 QString 的临时拷贝

          QStringRef name = xmlReader.name();
          if (name == "Number" )
          { // ...
          }

关于c++ - 使用 QXmlStreamReader C/Qt 解析 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17617567/

相关文章:

c++ - 以编程方式获取 Windows 设置 |账户设置 |需要登录

c++ - 在 visual studio 2015 cmake 中启用 c++14

c++ - 你能在 C++ 中保护嵌套类吗?

xml - 使用 tokenize 函数分割文本

xml - 哈希表包含$ null值

mysql - 使用 MySQL 驱动程序问题交叉编译 Qt5 (Mingw)

qt - 如何从 C++ 端多次将 QImage 对象设置为 QML 的 Image 元素?

c++ - 从另一个线程发出信号是否安全?

xml - 如果只有一个或零个(空)元素,则在元素之前添加 XML 处理指令

python - 将 matplotlib 图表嵌入到 Qt/C++ 应用程序中