2017-08-22 6 views
2

私はQXMLStreamReaderQXMLStreamWriterを使用してファイルを読み書きしています。XMLファイルを変更するQXMLStreamReader/Writer

しかし、例えば、このXMLを考え、私はXMLを変更することができるような方法を見つけることができないです:

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

これは、次のコードを使用して書かれている:私は今

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(); 

をもう1つ<LIGHT1>を既存のxmlファイルに追加したいのですが、QTでどのように行うことができますか?

私は次のことをやっている:

 //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(); 

をそして私は次のエラーを取得しています:

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

この[ポスト](https://stackoverflow.com/questions/11710598/reading-the-same-file-with-several-different-streams-in-qt)によれば、それが不可能です1つのデバイスに対して複数のストリームを持つ。 – piarston

+0

whileループで入力ファイルをクローズしています –

答えて

2

あなたはXMLからコンテンツを格納するのにQDomDocumentを使用することができます。新しい子、タグ、属性を作成できます。

#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

ありがとう、私は 'QDomDocument'を使うのが唯一の解決策だと思います。 – arqam

+0

@arqamだけではありません。オリジナルを読みながら新しいXMLをメモリバッファまたは一時ファイルに書き込んだり、オリジナルを新しいものに置き換えたりすることもできます。しかし、XMLがメモリに収まるのに十分小さい場合(たとえば、PC上では最大で数百メガバイト)、DOMを使用するほうが優れています。 – hyde

関連する問題