Qt读取XML文件
问题描述:
我想读取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;
}
,这里是什么代码给了我一些视觉输出:
真的,我只是不知道如何去加载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;
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;
}
上面的代码可能容易出错,因为它假设下一个孩子可能是什么,而不是实际测试它。虽然现在够好了。