自己收集的qt读写XML资料_第1页
自己收集的qt读写XML资料_第2页
自己收集的qt读写XML资料_第3页
自己收集的qt读写XML资料_第4页
自己收集的qt读写XML资料_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、自己收集的qt读写XML资料DOM方式(有点乱)(2010-11-01 11:22:23)转载标签:杂谈分类:Qt编程我们可以看到,如果所要读取的XML文件不是很大,采用DOM读取方法还是很便捷的,由于我用的也是DOM树读取的方法,所以,本文所介绍的也主要是基于DOM的方法读取。根据常用的操作,我简单的把对XML的操作分为以下几类:1 首先对XML文件进行操作,打开文件。这个其实就是对文件进行操作,可以把它直接定义为构造函数,在对对象进行初始化时完成。TopoDataReader:TopoDataReader(const wstring &filePath):_filePath(fil

2、ePath),_qDomDoc("mydocument"),_qFile(QString:fromStdWString(filePath) if (!_qFile.open(QIODevice:ReadOnly) return; if (!_qDomDoc.setContent(&_qFile) _qFile.close(); return; 2 读取XML文件中的节点内容假设XML文件格式如下(1)<switchs><switch snmpip=211.87.235.136 newwork=front></switch><

3、/switchs>(2)<ip>211.87.235.136</ip>对于第一种情况,采用如下方法:QDomElement docElem = _qDomDoc.documentElement();QDomNode nodeswitch=docElem.elementsByTagName("switch ");/红色的为标签名QDomElement elemnodeswitch=nodeswitch.toElement();string snmpip=qPrintable(elemnodeswitch.attribute("snmpi

4、p");/network的也是如此方法获取对于第二种情况,采用如下方法:直接调用text() API就可以了string ip=qPrintable(elementnodeip.text();但是,假设文件中有多个同样的节点,如下<a><b></b><b></b></a>这样用elementsByTagName("b")返回的就是一个childNodes()而不是一个单独的node了。我们可以使用at()方法具体定位。另外,我们还可以使用这样一种方法获取节点的值,假设XML文件如下- +<

5、;switch snmpIp="192.168.120.251" network="front"><name>前端主交换机</name><description />- <ipList><ip>192.168.120.251</ip></ipList><rwCommunity>public120</rwCommunity><workMode>true</workMode><workStatus>true&l

6、t;/workStatus><enableAlarm>true</enableAlarm><snmpCount>0</snmpCount><memoryUtilizationRatio>50.0</memoryUtilizationRatio><cpuUtilizationRatio>50.0</cpuUtilizationRatio><port>161</port><snmpStatus>true</snmpStatus><private

7、Name>CZ-5_FA</privateName><switchIndex>topLeft</switchIndex></switch>我们可以先获取switch节点,然后得到其childNodes(),于是就可以使用at()方法来获取下面的每个节点了(注:从0开始)比如说,上面的那个ip节点就是nodeswitch.childNodes().at(3)。这样做得好处就是不用担心重复的问题,只要你确定switch节点确定对了,底下的也就一定能确定了。3 返回某个节点下子节点的个数这个简单,也是直接调APIQDomElement docEl

8、em = _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便签”项目组中我负责有关后台XML操作的实现部分,现在对在项目中用到的XML的相关操作进行简单的小结。这几天搜集qt对X

9、ML格式文件的读写,着重于DOM这种方式,先将搜集的资料粘贴在下面, 以一个完整的流程:=如下:=我们知道对XML的操作有两种方法,即DOM方式和SAX方式。二者主要区别是:DOM实现方式操作非常简单,但不适合处理过大文件;而SAX实现方式是能处理很大的XML文件,但是需要开发者写一些复杂的代码。Qt提供了对应于这两种用于读取、操作和编写XML的实现类,分别是QDomDocument类和QXmlStreamReader类,由于在项目中涉及的文件不大,因此我们选用QDomDocument类来处理。项目中涉及便签的增删改查,对应于XML文件中相应标记的读、写和修改,下面分别介绍:1. 创建节点,将

10、其写入XML文件,主要操作包括:QDomDocument doc;1).创建根节点:QDomElement root = doc.documentElement("rootName " );2).创建元素节点:QDomElement element = doc.createElement_x("nodeName");3).添加元素节点到根节点:root. appendChild(element);4).创建元素文本:QDomText nodeText=doc.createTextNode("text");5).添加元素文本到元素节点:

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

12、ment_x("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 fil

13、e("test.xml");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();则test.xml文件:<?xml version="1.0" encoding="UTF-8"?>

14、<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<

15、/fontItalic><fontUnderline>true</fontUnderline></note></Notes>上面是创建一个便签节点,若要继续添加便签节点,则需要在已有节点后增加一个新节点,并重写入XML文件。2. 加载、查找便签时要读取XML文档中的节点信息,DOM实现方式是将整个文档当作一个对象来装入内存进行处理,然后开发者可以访问这个对象中的每一个节点,每一个节点对应XML文件里的一个标记。主要操作包括:1).读取根节点:QDomElement root = doc.documentElement();2).读取第一个子

16、节点:QDomNode node = root.firstChild();3).读取下一个子节点:node = node.nextSibling();4).匹配结点标记:node.toElement().tagName() = "note"5).读取节点文本:no = childNode.toText().data();/=遍历节点=可以通过doc.childNodes()获得doc的所有的子节点列表QDomNodeList。比如QDomNodeList list=doc.childNodes();for(int i=0;i<list.count();i+)QDomN

17、ode node=list.at(i);/好的风格当然是把定义写在外面:(/qDebug()<<”node name is “<<node.nodeName();/qDebug()<<”node type is “<<.nodeType();/=以下是项目中读取便签属性的函数实现代码:void MainWindow:parseAttr(const QDomElement &element)QString no,name,content,font,fontSize,color;QDomNode node = element.firstChi

18、ld();while (!node.isNull() if (node.toElement().tagName() = "note") /匹配note节点parseAttr(node.toElement(); else if (node.toElement().tagName() = "no") /匹配属性noQDomNode childNode = node.firstChild();if (childNode.nodeType() = QDomNode:TextNode) no = childNode.toText().data();else if

19、(node.toElement().tagName() = "name") /匹配属性name.node = node.nextSibling();/读取兄弟节点3. 删除便签时,要删除相应的XML节点,用到的主要函数为:root.removeChild(node); 但在删除某个节点后要重写整个文件。以上对XML文件的重写操作是必须的,因此在文件的打开方式中要加上QIODevice:Truncate,表示覆盖重写。目前还没有找到可以直接修改文件的方法,但若文件很大的情况下,必须考虑相应的效率问题。由于本项目在启动时需要将所有便签加载到内存,因此选用DOM方式比较合适,但如

20、果处理的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;

21、QDomDocument doc; if (!doc.setContent(&file, false, &errorStr, &errorLine, &errorColumn) return ; file.close();/也可以用doc.setContent(&file)带一个参数就行。/=然后按照上面方式遍历数据,修改后在以上面相同的方式写入到XML文件中。/=附加一段代码创建XML文件=int main( int argc, char *argv ) QApplication a( argc, argv ); QString xmlPath = &

22、quot;InitInfo.xml" QFile file(xmlPath); if (!file.open(QFile:ReadOnly | QFile:Text) return 1; QString errorStr; int errorLine; int errorColumn; QDomDocument doc; if (!doc.setContent(&file, false, &errorStr, &errorLine, &errorColumn) return 1; file.close(); QDomElement root = doc

23、.documentElement(); QString str = root.tagName(); if (root.tagName() != "Root") return 1; QDomElement element = doc.createElement_x("device3"); element.setAttribute("ChildName","Content"); QDomElement el_address = doc.createElement_x("Content "); el_address.setAttribute("key","equipmentname"); el_address.setAttribute("value","CSC101B"); el_address.setAttribute("name","

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论