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顯然簡潔很多。