我需要在程序的构造函数中创建一个QDomElement
,其中包含我的XML文件的根元素。
为此,程序首先尝试读取文件。如果无法读取文件,则将使用根元素创建新文件。在此之后,我得到了我的文件的根元素。
以下是我的代码:
bool hadToCreateXML=false;
bool wasLoadedCorrectly=false;
fileXML.setFileName("C:/logs.xml");
if(!fileXML.open(QIODevice::ReadOnly | QIODevice::Text)){
cout << "fail open, file does not exsist?" << endl;
if(!fileXML.open(QIODevice::WriteOnly | QIODevice::Text)){
cout << "failed creating file" << endl;
}
else{
ui->outputText->append("First time running");
hadToCreateXML=true;
QDomDocument tempFirstTime;
tempFirstTime.setContent(&fileXML);
tempFirstTime.createElement("MyRoot");
QTextStream stream(&fileXML);
stream << tempFirstTime.toString();
fileXML.close();
}
}
else wasLoadedCorrectly=true;
if(hadToCreateXML||wasLoadedCorrectly){
if(!documentXML.setContent(&fileXML)){
cout << "failed to load doc" << endl;
}
else {
rootXML=documentXML.firstChildElement();
fileXML.close();
}
}
它看起来很乱,不幸的是,这并没有按预期工作。如果文件不存在,则会创建该文件,但不会将根元素添加到该文件中。我做错了什么?
答案 0 :(得分:1)
使用类似的东西:
QFile fileXML;
bool hadToCreateXML=false;
bool wasLoadedCorrectly=false;
fileXML.setFileName("G:/logs.txt");
if(!fileXML.open(QIODevice::WriteOnly | QIODevice::Text)){
qDebug() << "failed creating file" << endl;
}
else{
hadToCreateXML=true;
QDomDocument tempFirstTime;
//tempFirstTime.setContent(&fileXML); don't use
tempFirstTime.appendChild(tempFirstTime.createElement("MyRoot"));
QTextStream stream(&fileXML);
stream << tempFirstTime.toString();
qDebug() << "data "<< tempFirstTime.toString();
fileXML.close();
}
您的错误:您将文件打开为WriteOnly
但尝试拨打setContent
,尝试读取文件,禁止播放。您将收到下一个调试错误:
QIODevice :: read:WriteOnly device
还可以使用QFile::exists()
检查文件是否存在。
所以你的代码应该是这样的:
if(fileXML.exists())
//read
else
//write