Qt中对于XML文件的写入有两种方式,一个是使用QXmlStreamWriter,另一个则为使用Dom。stream流的形式相对来说更加灵活,而且适合处理大文件。Dom方式由于是将内容加载到了内存中进行操作,所以对于小内存设备则有一定得局限性。
下面给出一个用Dom写xml文件的例子。
假设定义的节点如下
<?xml version="1.0" encoding="UTF-8"?> <data> <startweek>2010-03-01</startweek> <readnum>3</readnum> <alarm>7</alarm> <prompt>Alarm Window</prompt> </data>
则将其写为xml文件时,方法如下:
QFile file("write.xml"); if(!file.open(QIODevice::WriteOnly|QIODevice::Truncate)); QDomDocument doc; QDomProcessingInstruction instruction; instruction = doc.createProcessingInstruction("xml","version=/"1.0/" encoding=/"UTF-8/""); doc.appendChild(instruction); QDomElement root=doc.createElement(tr("data")); doc.appendChild(root); QDomElement StartWeek=doc.createElement(tr("startweek")); QDomElement ReadNumber=doc.createElement(tr("readnum")); QDomElement AlarmTime=doc.createElement(tr("alarm")); QDomElement AlarmPrompt=doc.createElement(tr("prompt")); QDomText text; text=doc.createTextNode("2010-03-01"); StartWeek.appendChild(text); text=doc.createTextNode("2"); ReadNumber.appendChild(text); text=doc.createTextNode("10"); AlarmTime.appendChild(text); text=doc.createTextNode("vibration"); AlarmPrompt.appendChild(text); root.appendChild(StartWeek); root.appendChild(ReadNumber); root.appendChild(AlarmTime); root.appendChild(AlarmPrompt); QTextStream out(&file); doc.save(out,4); file.close();
QDomProcessingInstruction instruction;
instruction = doc.createProcessingInstruction("xml","version=/"1.0/" encoding=/"UTF-8/"");
用来写入XML文件的声明,这对于一个XML文件来说不可缺少。
其次写入根节点,然后依次写入相应的子节点。最后从内存写入文件中。
如果需要用Dom方式对其进行解析,则其为一逆过程,方法如下:
QDomDocument doc; QFile file("../TEA_Main/files/sysconfig.xml"); if (!file.open(QIODevice::ReadOnly)) return; if (!doc.setContent(&file)) { file.close(); return; } file.close(); QDomElement docElem = doc.documentElement(); QDomNode n = docElem.firstChild(); while(!n.isNull()) { QDomElement e = n.toElement(); // try to convert the node to an element. if(!e.isNull()) { qDebug()<<e.tagName() << ":" << e.text(); } n = n.nextSibling(); } file.close(); }
使用一个while循环将节点内容读入内存,并根据自己的方式进行处理即可。
和前面的QXmlStreamReader解析XML相比,Dom显然简洁很多。