2014-12-02 110 views
2

我想讀取Qt中的一個xml文件,我使用其他方法成功生成了該文件。這裏是我的xml文件:Qt讀取XML文件

<?xml version="1.0" encoding="UTF-8"?> 
<Project> 
    <EditorTheme>NULL</EditorTheme> 
    <Modules> 
     <Module> 
      <Name>Module_Renderer</Name> 
      <Position>471,164</Position> 
      <Size>200,100</Size> 
      <Locked>true</Locked> 
      <Visible>true</Visible> 
     </Module> 
     <Module> 
      <Name>Module_Console</Name> 
      <Position>200,229</Position> 
      <Size>256,192</Size> 
      <Locked>true</Locked> 
      <Visible>false</Visible> 
     </Module> 
     <Module> 
      <Name>Module_ResourceToolkit</Name> 
      <Position>1049,328</Position> 
      <Size>200,100</Size> 
      <Locked>true</Locked> 
      <Visible>true</Visible> 
     </Module> 
     <Module> 
      <Name>Module_CellEditor</Name> 
      <Position>542,564</Position> 
      <Size>200,100</Size> 
      <Locked>true</Locked> 
      <Visible>false</Visible> 
     </Module> 
    </Modules> 
</Project> 

這裏是一些代碼,我使用的解析這個文件:

Project ProjectLoader::loadLastProject(ConsoleModule* console) { 
    Project project; 
    // load xml 
    QFile file("C:/Users/Krynn/Desktop/LastProject.xml"); 
    if(!file.open(QFile::ReadOnly | QFile::Text)) { 
     // print error cannot open 
    } 
    QXmlStreamReader reader; 
    console->outputDisplay->append("Test"); 
    reader.setDevice(&file); 
    reader.readNext(); 
    while(!reader.atEnd() && !reader.hasError()) { 
     reader.readNext(); 
     if(reader.isStartElement()) { 
      QString name = reader.name().toString(); 
      if(reader.name() == "Project") { 
       reader.readNextStartElement(); 
       if(reader.name().toString() == "EditorTheme") { 
        // Append Project theme 
        console->outputDisplay->append("Theme Detected: " + reader.name().toString() + " " + reader.readElementText()); 
       } 
       reader.readNextStartElement(); 
       if(reader.name().toString() == "Modules") { 
        // how do I proceed?? 
        console->outputDisplay->append(QString("") + " " + reader.name().toString() + " " + reader.readElementText()); 
       } 

      } 
     } 
    } 
    if(reader.hasError()) { 
     console->outputDisplay->append("XML error: " + reader.errorString()); 
    } else if(reader.atEnd()) { 
     console->outputDisplay->append("End of XML File Reached"); 
    } 
    file.close(); 
    return project; 
} 

,這裏是什麼代碼給了我一些視覺輸出: enter image description here

真的,我只是不知道如何去加載XML文件中的所有模塊數據。我之前使用純文本文件來存儲所有這些東西,但現在我想升級。任何幫助將不勝感激。

回答

3

沒關係我想通了。

Project ProjectLoader::loadLastProject(ConsoleModule* console) { 
    Project project; 
    // load xml 
    QFile file("C:/Users/Krynn/Desktop/LastProject.xml"); 
    if(!file.open(QFile::ReadOnly | QFile::Text)) { 
     // print error cannot open 
    } 
    QXmlStreamReader reader; 
    reader.setDevice(&file); 
    reader.readNext(); 
    int count = 0; 
    while(!reader.atEnd()) { //&& !reader.hasError() 
     reader.readNext(); 
     if(reader.isStartElement()) { 
      if(reader.name().toString() == "Module") { 
       WindowModuleSaveData data; 
       reader.readNextStartElement(); 
       data.name = reader.readElementText(); // name 
       reader.readNextStartElement(); 
       data.position = convertStringToQPoint(reader.readElementText()); 
       console->outputDisplay->append(convertQPointToString(data.position)); 
       reader.readNextStartElement(); 
       data.size = convertStringToQSize(reader.readElementText()); 
       reader.readNextStartElement(); 
       data.isLocked = reader.readElementText() == "true" ? true : false; 
       reader.readNextStartElement(); 
       data.isVisible = reader.readElementText() == "true" ? true : false; 
       project.modules.push_back(data); 
       console->outputDisplay->append("Loaded A Module"); 
      } 
      count++; 
     } 
    } 
    console->outputDisplay->append(QString::number(count)); 
    if(reader.hasError()) { 
     console->outputDisplay->append("XML error: " + reader.errorString()); 
    } else if(reader.atEnd()) { 
     console->outputDisplay->append("End of XML File Reached"); 
    } 
    file.close(); 
    return project; 
} 

上面的代碼可能容易出錯,因爲它假設下一個孩子可能是什麼,而不是實際測試它。雖然現在夠好了。