Append nodes to an XML file
-
Hi all,
I have
xmlfile which looks like this:<!DOCTYPE patientDetails> <subject_details> <Name>Name1</Name> <Surname>Surname1</Surname> <Patient_ID>PID01</Patient_ID> <Date>01/01/2000 00:00</Date> <Clinician_Note>some note for testing</Clinician_Note> </subject_details>I need to modify and
appendmorenodesto the above xml.For ex. My new node to be added to the above file looks like this:
<settings> <Current>35</Current> </settings>I tried doing this:
QString errorMsg; int errorLine,errorColumn; QDomDocument document; QString path = QCoreApplication::applicationDirPath()+"/data/"+"PID02"+".xml"; qDebug()<<path; //Load the file QFile file(path); if(!file.open(QIODevice::ReadWrite | QIODevice::Text)) { qDebug()<<"failed to open file"; return -1; } else { if(!document.setContent(&file,&errorMsg, &errorLine, &errorColumn)) { qDebug () << file<<errorMsg << errorLine << errorColumn; qDebug() << "Failed to load the file for reading."; } file.close(); } document.setContent(&file); QDomElement root = document.documentElement(); QDomElement newTag = document.createElement(QString("Settings")); QDomElement newCurrTag = document.createElement(QString("Current")); QDomText newCurrVal = document.createTextNode(QString("45")); newCurrTag.appendChild(newCurrVal); newTag.appendChild(newCurrTag); root.appendChild(newTag); QTextStream output(&file); output << document.toString(); file.close();EDITED
I cant write new nodes to my file and the consol says:ReadOnly DeviceWhat I'm doing wrong here?
Thanks
-
Try to pass a proper xml - it should start with '<?xml version="1.0"?>'
-
I tried with a modified xml but the same issue.
This error comes only when I open the file to
Append:QIODevice::ReadWrite | QIODevice::Append | QIODevice::TextBut if it's just for
ReadWriteQIODevice::ReadWrite | QIODevice::TextAtleast file is leading. Though I can't change the xml file..
-
Did not notice it - for sure QIODevice::Append will not work. So what's your actual output?
-
If I do
QIODevice::ReadWrite | QIODevice::Text, file loading ok. But I cant write new nodes to it..Consol says
ReadOnly deviceAny idea where I'm wrong?
-
If I do
QIODevice::ReadWrite | QIODevice::Text, file loading ok. But I cant write new nodes to it..Consol says
ReadOnly deviceAny idea where I'm wrong?
@russjohn834
If I understand what you are trying to do correctly, we have gone through this many times in this forum. If your goal is to update XML in a file, you don't open the file for append or read-write or anything like that. You open the file read-only, read it all in, close it. Make your changes to the in-memory document. Then open the file for overwrite, write all content, close file. (Or write to a new file and then delete/rename.) Your code will contain neitherQIODevice::ReadWritenorQIODevice::Append. -
@russjohn834 said in Append nodes to an XML file:
Hi
......
root.appendChild(newTag);
there is missing a file open here ? ( you call close higher up but i dont see an open for write ?)
QTextStream output(&file);
output << document.toString();
file.close(); -
@russjohn834 said in Append nodes to an XML file:
Hi
......
root.appendChild(newTag);
there is missing a file open here ? ( you call close higher up but i dont see an open for write ?)
QTextStream output(&file);
output << document.toString();
file.close();This post is deleted! -
@russjohn834 said in Append nodes to an XML file:
Hi
......
root.appendChild(newTag);
there is missing a file open here ? ( you call close higher up but i dont see an open for write ?)
QTextStream output(&file);
output << document.toString();
file.close();Thank you @mrjj @JonB
I can now append a new node to my file, I did as follows:if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug () << "Error saving XML file...."; file.close(); } document.setContent(&file); QDomElement root = document.documentElement(); file.close(); QDomElement newTag = document.createElement(QString("Settings")); QDomElement newCurrTag = document.createElement(QString("Current")); QDomText newCurrVal = document.createTextNode(QString("45")); newCurrTag.appendChild(newCurrVal); newTag.appendChild(newCurrTag); root.appendChild(newTag); file.open(QIODevice::WriteOnly | QIODevice::Text); QTextStream output(&file); output << document.toString(); file.close(); -
Thank you @mrjj @JonB
I can now append a new node to my file, I did as follows:if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug () << "Error saving XML file...."; file.close(); } document.setContent(&file); QDomElement root = document.documentElement(); file.close(); QDomElement newTag = document.createElement(QString("Settings")); QDomElement newCurrTag = document.createElement(QString("Current")); QDomText newCurrVal = document.createTextNode(QString("45")); newCurrTag.appendChild(newCurrVal); newTag.appendChild(newCurrTag); root.appendChild(newTag); file.open(QIODevice::WriteOnly | QIODevice::Text); QTextStream output(&file); output << document.toString(); file.close();@russjohn834
That's much better!Now just a minor picky for good code.
if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug () << "Error saving XML file...."; file.close(); } ...Don't forget to put some kind of
returnat the end of that error case so it does not continue into the "opened" code. And (unless you know better forQFile) don'tfile.close()if you are inside anif (!file.open()), because the file never got opened! Plus, change all that indentation after theif's}, so it doesn't look like it's all still inside theif:) -
@JonB Thank you for the feedback :)