QT中如何实现XML文件的创建、增加、修改、删除功能。
分类: QT学习2013-03-21 16:01 6285人阅读 评论(0) 收藏 举报
一、首先咱们得认识处理XML的方法有那些,QT提供了那些函数用于处理。
我们知道对XML的操作有两种方法,即DOM方式和SAX方式。二者主要区别是:DOM实现方式操作非常简单,但不适合处理过大文件;而SAX实现方式是能处理很大的XML文件,但是需要开发者写一些复杂的代码。Qt提供了对应于这两种用于读取、操作和编写XML的实现类,分别是QDomDocument类和QXmlStreamReader类,由于在项目中涉及的文件不大,因此我们选用QDomDocument类来
处理。
二、咱们需要了解XML文件的最常见格式:
1、需要知道一个XML文件有且只有一个根节点;
2、子节点与元素的概念,以及它们之间的联系(如何包含);
三、对XML文件创建,读取、修改:
1. 创建节点,将其写入XML文件,主要操作包括:
QDomDocument doc;
1).创建根节点:QDomElement root = ateElement("root")
2).创建元素节点:QDomElement element = ateElement("nodeName");
3).添加元素节点到根节点:root. appendChild(element);
4).创建元素文本:QDomText ateTextNode("text");
5).添加元素文本到元素节点:element. appendChild(nodeText);
在本项目中,假设便签的属性有序号、名字、内容、字体、字号、颜、粗细、斜体、下划线这几项,则在文件中添加一个便签节点的操作如下:
QDomDocument doc;
instruction = ateProcessingInstruction("xml","version="1.0" encoding="UTF-8"");
doc.appendChild(instruction);
QDomElement root = ateElement_x_x("Notes");
doc.appendChild(root);
QDomElement note = ateElement_x_x("note");
root.appendChild(note);
QDomElement no = ateElement_x_x("no");
note.appendChild(no);
...
...
QDomText no_text = ateTextNode("001");
...
...
则得到一个便签节点,将其保存到l文件中,代码如下:
QFile file("l");
if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate |QIODevice::Text))
return ;
QTextStream out(&file);
out.setCodec("UTF-8");
doc.save(out,4,QDomNode::EncodingFromTextStream);
file.close();
则l文件:
<?xml version="1.0" encoding="UTF-8"?>
<Notes>
<note>
<no>001</no>
<name>2010-05-10(13:53:24)</name>
<content>A meeting!</content>
<font>Script MT Bold</font>
<fontSize>16</fontSize>
<color> #00ffff</color>
<weight>0</weight>
<fontItalic>true</fontItalic>
<fontUnderline>true</fontUnderline>
</note>
</Notes>
上面是创建一个便签节点,若要继续添加便签节点,则需要在已有节点后增加一个新节点,并重写入XML文件。
2. 加载、查便签时要读取XML文档中的节点信息,DOM实现方式是将整个文档当作一个对象来装入内存进行处理,然后开发者可以访问这个对象中的每一个节点,每一个节点对应XML文件里的一个标记。
主要操作包括:
1).读取根节点:QDomElement root = doc.documentElement();
2).读取第一个子节点:QDomNode node = root.firstChild();
3).读取下一个子节点:node = Sibling();
4).匹配结点标记:Element().tagName() == "note"
5).读取节点文本:no = Text().data();
//========================遍历节点================
可以通过doc.childNodes()获得doc的所有的子节点列表QDomNodeList。比如
//========================遍历节点================
可以通过doc.childNodes()获得doc的所有的子节点列表QDomNodeList。比如
QDomNodeList list=doc.childNodes();
for(int i=0;i&unt();i++){
QDomNode node=list.at(i);//好的风格当然是把定义写在外面createprocessa:(
//qDebug()<<”node name is “<&deName();
/
/qDebug()<<”node type is “<<.nodeType();
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论