Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 修改XML文件QXMLStreamReader/Writer_C++_Qt - Fatal编程技术网

C++ 修改XML文件QXMLStreamReader/Writer

C++ 修改XML文件QXMLStreamReader/Writer,c++,qt,C++,Qt,我正在使用QXMLStreamReader和QXMLStreamWriter对文件进行读写 但是我找不到一种方法来修改XML,例如,考虑这个XML: <?xml version="1.0"?> <LAMPS> <LIGHT1> <State>statevalue</State> <Room>roomvalue</Room> <Potencial>

我正在使用
QXMLStreamReader
QXMLStreamWriter
对文件进行读写

<>但是我找不到一种方法来修改XML,例如,考虑这个XML:

<?xml version="1.0"?>
<LAMPS>
    <LIGHT1>
        <State>statevalue</State>
        <Room>roomvalue</Room>
        <Potencial>potencialvalue</Potencial>
    </LIGHT1>
</LAMPS>
现在我想在现有的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

您可以使用
QDomDocument
存储XML中的内容。可以创建新的子项、标记和属性

#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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main()
{
QFile文件(“test.xml”);
如果(!file.open(QIODevice::ReadOnly | QIODevice::Text))
{

qDebug()根据这一点,一台设备不可能有多个流。您正在关闭while循环中的输入文件。谢谢,我想在这种情况下,使用
QDomDocument
是唯一的解决方案。@arqam不仅是唯一的方法。您还可以在读取原始XML时将新XML写入内存缓冲区或临时文件,然后替换原始XML但如果XML足够小,可以放入内存(比如说,在PC上最多可以容纳数百兆字节),那么使用DOM就更好了。
#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;
}