c++ - 修改XML文件QXMLStreamReader/Writer

标签 c++ qt

我正在做一些我正在使用 QXMLStreamReader 的事情和QXMLStreamWriter ,读取和写入文件。

但是我找不到修改 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();

现在我想再添加一个<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

最佳答案

您可以使用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;
}

关于c++ - 修改XML文件QXMLStreamReader/Writer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45814463/

相关文章:

c++ - 如何将ASCII转换为无符号整数

c++ - unique_ptr 没有操作删除

c++ - DirectShow 使用 C++ 无限循环视频

c++ - Qt 如何在 QtConcurrent 中绑定(bind)指向非静态成员函数的指针?

qt - QCoreApplication退出不工作

c++ - 手动停止 QDrag

c++ - 构建一组随机点的四面体 - 四面体化

c++ - 为什么 C++ 并发在 action listing_6.1 中不使用 std::recursive_mutex

qt - 如何在Qmake项目中向MOC添加特定标志?

c++ - qtextedit - 调整大小以适应