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;
}