2014-12-02 3 views
2

다른 방법을 사용하여 성공적으로 생성 한 Qt에서 XML 파일을 읽으려고합니다. 그 코드는 나에게주는 무슨에 대한 시각적 출력 여기Qt XML 파일 읽기

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 파일입니다

<?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> 

그리고 여기이 파일을 구문 분석하는 데 사용하고 몇 가지 코드

정말, 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; 
} 

위의 코드는 다음 자식이 실제로 테스트하지 않고 오류가 발생할 수 있다고 가정하기 때문에 오류가 발생할 수 있습니다. 그래도 지금은 충분히 좋습니다.