qt读写xml资料[dom方式]

上传人:第*** 文档编号:30975875 上传时间:2018-02-03 格式:DOC 页数:7 大小:50.50KB
返回 下载 相关 举报
qt读写xml资料[dom方式]_第1页
第1页 / 共7页
qt读写xml资料[dom方式]_第2页
第2页 / 共7页
qt读写xml资料[dom方式]_第3页
第3页 / 共7页
qt读写xml资料[dom方式]_第4页
第4页 / 共7页
qt读写xml资料[dom方式]_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《qt读写xml资料[dom方式]》由会员分享,可在线阅读,更多相关《qt读写xml资料[dom方式](7页珍藏版)》请在金锄头文库上搜索。

1、qt 读写 XML 资料DOM 方式我们可以看到,如果所要读取的 XML 文件不是很大,采用 DOM 读取方法还是很便捷的,由于我用的也是 DOM 树读取的方法,所以,本文所介绍的也主要是基于 DOM 的方法读取。根据常用的操作,我简单的把对 XML 的操作分为以下几类:1 首先对 XML 文件进行操作,打开文件。这个其实就是对文件进行操作,可以把它直接定义为构造函数,在对对象进行初始化时完成。TopoDataReader:TopoDataReader(const wstring &filePath):_filePath(filePath),_qDomDoc(mydocument),_qFil

2、e(QString:fromStdWString(filePath)if (!_qFile.open(QIODevice:ReadOnly)return;if (!_qDomDoc.setContent(&_qFile)_qFile.close();return;2 读取 XML 文件中的节点内容假设 XML 文件格式如下(1)(2)211.87.235.136对于第一种情况,采用如下方法:QDomElement docElem = _qDomDoc.documentElement();QDomNode nodeswitch=docElem.elementsByTagName(switch )

3、;/红色的为标签名QDomElement elemnodeswitch=nodeswitch.toElement();string snmpip=qPrintable(elemnodeswitch.attribute(snmpip);/network 的也是如此方法获取对于第二种情况,采用如下方法:直接调用 text() API 就可以了string ip=qPrintable(elementnodeip.text();但是,假设文件中有多个同样的节点,如下这样用 elementsByTagName(b)返回的就是一个 childNodes()而不是一个单独的 node 了。我们可以使用 at

4、()方法具体定位。另外,我们还可以使用这样一种方法获取节点的值,假设 XML 文件如下- +前端主交换机- 192.168.120.251public120truetruetrue050.050.0161trueCZ-5_FAtopLeft我们可以先获取 switch 节点,然后得到其 childNodes(),于是就可以使用 at()方法来获取下面的每个节点了(注:从 0 开始)比如说,上面的那个 ip 节点就是 nodeswitch.childNodes().at(3)。这样做得好处就是不用担心重复的问题,只要你确定 switch 节点确定对了,底下的也就一定能确定了。3 返回某个节点下子

5、节点的个数这个简单,也是直接调 APIQDomElement docElem = _qDomDoc.documentElement();QDomNode nodetagname=docElem.elementsByTagName(tagname).at(0);/假设有多个tagname 此处选第一个int num=nodetagname.childNodes().size();好了,临时想起来就这么多。以后想起来再添。 /=Qt 学习之 XML 读写操作小结2010 年 05 月 25 日 评论(0)|浏览(315)点击查看原文Qt 学习之 XML 读写操作小结在“QQ 便签”项目组中我负责有

6、关后台 XML 操作的实现部分,现在对在项目中用到的 XML的相关操作进行简单的小结。这几天搜集 qt 对 XML 格式文件的读写,着重于 DOM 这种方式,先将搜集的资料粘贴在下面,以一个完整的流程:=如下:=我们知道对 XML 的操作有两种方法,即 DOM 方式和 SAX 方式。二者主要区别是:DOM 实现方式操作非常简单,但不适合处理过大文件;而 SAX 实现方式是能处理很大的 XML 文件,但是需要开发者写一些复杂的代码。Qt 提供了对应于这两种用于读取、操作和编写 XML 的实现类,分别是QDomDocument 类和 QXmlStreamReader 类,由于在项目中涉及的文件不大

7、,因此我们选用QDomDocument 类来处理。项目中涉及便签的增删改查,对应于 XML 文件中相应标记的读、写和修改,下面分别介绍:1. 创建节点,将其写入 XML 文件,主要操作包括:QDomDocument doc;1).创建根节点:QDomElement root = doc.documentElement(rootName );2).创建元素节点:QDomElement element = doc.createElement_x(nodeName);3).添加元素节点到根节点:root. appendChild(element);4).创建元素文本:QDomText nodeTex

8、t=doc.createTextNode(text);5).添加元素文本到元素节点:element. appendChild(nodeText);在本项目中,假设便签的属性有序号、名字、内容、字体、字号、颜色、粗细、斜体、下划线这几项,则在文件中添加一个便签节点的操作如下:QDomDocument doc;instruction = doc.createProcessingInstruction(xml,version=1.0 encoding=UTF-8);doc.appendChild(instruction);QDomElement root = doc.createElement_x(

9、Notes);doc.appendChild(root);QDomElement note = doc.createElement_x(note);root.appendChild(note);QDomElement no = doc.createElement_x(no);note.appendChild(no);.QDomText no_text = doc.createTextNode(001);.则得到一个便签节点,将其保存到 test.xml 文件中,代码如下:QFile file(test.xml);if (!file.open(QIODevice:WriteOnly | QIOD

10、evice:Truncate |QIODevice:Text)return ;QTextStream out(out.setCodec(UTF-8);doc.save(out,4,QDomNode:EncodingFromTextStream);file.close();则 test.xml 文件:0012010-05-10(13:53:24)A meeting!Script MT Bold16#00ffff0truetrue上面是创建一个便签节点,若要继续添加便签节点,则需要在已有节点后增加一个新节点,并重写入 XML 文件。2. 加载、查找便签时要读取 XML 文档中的节点信息,DOM 实

11、现方式是将整个文档当作一个对象来装入内存进行处理,然后开发者可以访问这个对象中的每一个节点,每一个节点对应 XML 文件里的一个标记。主要操作包括:1).读取根节点:QDomElement root = doc.documentElement();2).读取第一个子节点:QDomNode node = root.firstChild();3).读取下一个子节点:node = node.nextSibling();4).匹配结点标记:node.toElement().tagName() = note5).读取节点文本:no = childNode.toText().data();/=遍历节点=可

12、以通过 doc.childNodes()获得 doc 的所有的子节点列表 QDomNodeList。比如QDomNodeList list=doc.childNodes();for(int i=0;ilist.count();i+)QDomNode node=list.at(i);/好的风格当然是把定义写在外面:(/qDebug()”node name is “node.nodeName();/qDebug()”node type is “.nodeType();/=以下是项目中读取便签属性的函数实现代码:void MainWindow:parseAttr(const QDomElement

13、&element)QString no,name,content,font,fontSize,color;QDomNode node = element.firstChild();while (!node.isNull() if (node.toElement().tagName() = note) /匹配 note 节点parseAttr(node.toElement(); else if (node.toElement().tagName() = no) /匹配属性 noQDomNode childNode = node.firstChild();if (childNode.nodeTyp

14、e() = QDomNode:TextNode) no = childNode.toText().data();else if (node.toElement().tagName() = name) /匹配属性 name.node = node.nextSibling();/读取兄弟节点3. 删除便签时,要删除相应的 XML 节点,用到的主要函数为:root.removeChild(node); 但在删除某个节点后要重写整个文件。以上对 XML 文件的重写操作是必须的,因此在文件的打开方式中要加上QIODevice:Truncate,表示覆盖重写。目前还没有找到可以直接修改文件的方法,但若文件

15、很大的情况下,必须考虑相应的效率问题。由于本项目在启动时需要将所有便签加载到内存,因此选用 DOM 方式比较合适,但如果处理的 XML 文件很大,而且不需要全部读到内存时,可以用 SAX 实现方式,它按阶段将文档读取到内存中,在碰到标签或者其它阶段的时候,可以调用开发者预先设计好的回调函数去处理,这样效率比 DOM 方式更高。4.读取 XML 文件内容:/=打开 document=add me =QString xmlPath = filename.xml;QFile file(xmlPath);if (!file.open(QFile:ReadOnly | QFile:Text)return ;QString errorStr;int errorLine;int errorColumn;QDomDocument doc;if (!doc.setConten

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 工程造价

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号