首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >修改XML文件QXMLStreamReader/Writer

修改XML文件QXMLStreamReader/Writer
EN

Stack Overflow用户
提问于 2017-08-22 17:55:47
回答 1查看 1.6K关注 0票数 2

我正在做一些事情,我使用QXMLStreamReaderQXMLStreamWriter来读写文件。

但是我找不到一种可以修改XML的方法,例如,考虑这样的XML:

代码语言:javascript
复制
<?xml version="1.0"?>
<LAMPS>
    <LIGHT1>
        <State>statevalue</State>
        <Room>roomvalue</Room>
        <Potencial>potencialvalue</Potencial>
    </LIGHT1>
</LAMPS>

这是使用以下代码编写的:

代码语言:javascript
复制
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();

现在我想在现有的xml文件中再添加一个<LIGHT1>,那么如何在QT中实现呢?

我正在做以下工作:

代码语言:javascript
复制
     //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();

并且我得到了以下错误:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-22 19:00:21

您可以使用QDomDocument存储来自XML的内容。您可以创建新的子项、标签、属性。

代码语言:javascript
复制
#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;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45814463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档