2013-07-12 154 views
1

我尝试使用我的程序cpp解析XML文件,并将其存储在QList中,但我不知道为什么当我执行代码时应用程序不返回任何内容(有时它关闭单独)使用QXmlStreamReader解析XML文件C/Qt

这是我的函数:

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> 
+0

做出的QString的临时副本你有没有通过代码调试?你有什么发现? –

回答

1

我建议你继续工作/与普通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

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