2017-08-22 2 views
2

Ich arbeite an etwas, wo ich QXMLStreamReader und QXMLStreamWriter verwende, um in eine Datei zu lesen und zu schreiben.Ändern einer XML-Datei QXMLStreamReader/Writer

aber ist nicht in der Lage, einen Weg so zu finden, dass ich eine XML ändern kann, zum Beispiel dieses XML betrachten:

<?xml version="1.0"?> 
<LAMPS> 
    <LIGHT1> 
     <State>statevalue</State> 
     <Room>roomvalue</Room> 
     <Potencial>potencialvalue</Potencial> 
    </LIGHT1> 
</LAMPS> 

Dieser geschrieben wird mit dem folgenden Code:

QFile file(filename); 
file.open(QIODevice::WriteOnly); 

QXmlStreamWriter xmlWriter(&file); 
xmlWriter.setAutoFormatting(true); 
xmlWriter.writeStartDocument(); 

xmlWriter.writeStartElement("LAMPS"); 

xmlWriter.writeStartElement("LIGHT1"); 
xmlWriter.writeTextElement("State", "statevalue"); 
xmlWriter.writeTextElement("Room", "roomvalue"); 
xmlWriter.writeTextElement("Potencial", "potencialvalue"); 
xmlWriter.writeEndElement(); 
xmlWriter.writeEndElement(); 
file.close(); 

Now I Möchten Sie eine weitere <LIGHT1> zu einer bestehenden XML-Datei hinzufügen, wie ist das dann in QT möglich?

Ich tue folgendes:

 //filename = my file path 
    QFile file(filename); 
    file.open(QIODevice::ReadWrite); 
    QXmlStreamWriter xmlWriter(&file); 
    QXmlStreamReader xmlReader; 
    xmlReader.setDevice(&file); 
    xmlWriter.setAutoFormatting(true); 
    while(!xmlReader.atEnd()){ 
     if(xmlReader.isStartDocument()) 
      xmlWriter.writeStartDocument(); 
     if(xmlReader.isStartElement()){ 
      xmlWriter.writeStartElement(xmlReader.name().toString()); 
      if(xmlReader.name()=="LAMPS"){ 
       xmlWriter.writeStartElement("Arqam"); 
       xmlWriter.writeTextElement("Arqam","Lucid Dreamer"); 
       xmlWriter.writeEndElement(); 
      } 
     } 
     if(xmlReader.isEndElement()) 
      xmlWriter.writeEndElement(); 
     if(xmlReader.isEndDocument()) 
      xmlWriter.writeEndDocument(); 
     xmlReader.readNext(); 
     file.close(); 

Und ich bin immer folgende Fehler:

QIODevice::write (QFile, "/Users/arqam/Desktop/XMLGenrator/input/zzzz.xml"): device not open 
QIODevice::read (QFile, "/Users/arqam/Desktop/XMLGenrator/input/zzzz.xml"): device not open 
+0

Nach diesem [Beitrag] (https://stackoverflow.com/questions/11710598/reading-the-same-file-with-several-different-streams-in-qt), ist es nicht möglich, mehrere Streams für ein einzelnes Gerät haben – piarston

+0

Sie schließen die Eingabedatei in der While-Schleife –

Antwort

2

Sie QDomDocument Inhalte speichern von XML verwenden können. Sie können ein neues Kind, Tag, Attribut erstellen.

#include <QXmlStreamReader> 
#include <QXmlStreamWriter> 
#include <QFile> 
#include <QDomElement> 
#include <QDomDocument> 
#include <QDomText> 
#include <QTextStream> 

int main() 
{ 
    QFile file("test.xml"); 
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) 
    { 
     qDebug() << "Failed to open file"; 
     return 0; 
    } 
    QDomDocument document; 
    if (!document.setContent(&file)) 
    { 
     qDebug() << "failed to parse file"; 
     file.close(); 
     return 0; 
    } 

    file.close(); 

    QDomElement docEle = document.documentElement(); 
    QDomNodeList elements = docEle.elementsByTagName("LAMPS"); 

    QDomElement light1 = document.createElement("LIGHT1"); 
    QDomElement state = document.createElement("State"); 
    QDomText nextNode = document.createTextNode("State"); 
    state.appendChild(nextNode); 
    light1.appendChild(state); 
    docEle.appendChild(light1); 

    QFile outFile("test-result.xml"); 
    if(!outFile.open(QIODevice::WriteOnly | QIODevice::Text)) 
    { 
     qDebug("Failed to open file for writing."); 
     return 0; 
    } 

    QTextStream stream(&outFile); 
    stream << document.toString(); 

    outFile.close(); 
    return 0; 
} 
+0

Danke, ich denke, mit 'QDomDocument' ist die einzige Lösung in diesen Fällen. – arqam

+0

@arqam Nicht nur Weg. Sie können das neue XML auch in einen Speicherpuffer oder eine temporäre Datei schreiben, während Sie das Original lesen, und dann das Original durch das neue ersetzen, nachdem es vollständig ist. Aber wenn das XML klein genug ist, um in den Speicher zu passen (sagen wir, höchstens einige hundert Megabyte auf einem PC), dann ist die Verwendung von DOM besser. – hyde