firemail
标题: Qt使用Dom操作XML文件 [打印本页]
作者: hechengjin 时间: 2016-6-28 21:06
标题: Qt使用Dom操作XML文件
http://blog.csdn.net/huihui1988/article/details/5719469
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显然简洁很多。
欢迎光临 firemail (http://firemail.wang:8088/) |
Powered by Discuz! X3 |