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显然简洁很多。
阅读(2393) | 评论(0) | 转发(1) |