Qt中使用DOM对XML进行的各种解析
QDomDocument读取和编辑xml文件

QDomDocument读取和编辑xml⽂件Qt中⼏种操作xml的⽅式流⽅式sax⽅式dom⽅式初学时,我常常采⽤流⽅式读取xml,该⽅式简单直观,容易理解。
之后遇到了需要修改xml并重新写回的情况,流⽅式就显得捉襟见肘了。
sax⽅式接触不多,从来没有在实际⽣产中使⽤过。
dom⽅式概念复杂,对于个⼈来说,⽂档也不是很清晰,导致我⼀直对这个⽅式不甚了解,最近下定决⼼好好研究⼀番,也算是⼤致清楚了个中“套路”,在此记录,以便今后查阅。
注意:如果你对QDomDocument没有任何了解,则不适合阅读此⽂章。
如果你在使⽤QDomDocumentde的过程中产⽣了疑惑,则此⽂可能对你产⽣帮助。
如有疏漏,还望指正。
QDomNode ? QDomElemet? QDomAttr?QDomText?初见QDomDocument时,我被这些东西搞得⼀头雾⽔。
直到我看到了某博客中这样⼀段话:QDom前缀的都是代表节点类型。
所以有,QDomElement代表⼀个Element节点,⽽QDomText代表⼀个Text节点。
QDomNode 类可以存储任意类型的节点。
如果想进⼀步处理⼀个节点,⾸先必须把它转化为正确的数据类型。
QDomNode调⽤toElement()以把它转化成QDomElement,然后调⽤tagName()来获得元素的标签名称。
如果节点不是Element类型,那么toElement()函数就返回⼀个空QDomElement对象和⼀个空标签。
我们对xml操作,⽆⾮对节点⽂本,节点属性进⾏操作,因此,我着重在这个基础上整理⼀下。
QDomNode 兼容所有节点类型。
这⾥只讨论QDomNode为QDomElemet的情况;此时读者⼼⾥⼀惊,难道,还有不是的情况?当然有!QDomNode QDomElemet举个简单例⼦你看!有如下xml<bookstore category="xml"><book category="CHILDREN"><title>Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price></book><!-- asdasd--><book category="WEB"><title>Learning XML</title><author>Erik T. Ray</author><year>2003</year><price>39.95</price></book><test>hello</test></bookstore>有如下代码:code 01QDomElement root = doc.documentElement();QDomNode node= root.firstChild();qDebug() << root.attributeNode("category").value();while(!node.isNull()){qDebug() << "xx";node = node.nextSibling();}结果会输出⼏个xx呢?代码做出如下更改code 02QDomElement root = doc.documentElement();QDomElement node= root.firstChildElement();qDebug() << root.attributeNode("category").value();while(!node.isNull()){qDebug() << "xx";node = node.nextSiblingElement();}结果会输出⼏个xx呢?答案分别是4和3!:smirk: :smirk:结论:注释是QDomNode⽽不是QDomElement到这⾥,⼤家应该就能明⽩两者的区别了。
dom解析xml原理

dom解析xml原理DOM(Document Object Model)是一种用于处理和表示XML文档的标准。
通过DOM,开发者可以很容易地访问和操作XML文档的内容。
DOM解析XML的原理是将整个XML文档加载到内存中,构建一个树状结构的节点,并通过节点之间的关系来表示XML元素的层次结构。
在DOM解析XML的过程中,主要包括以下几个步骤:1. 加载XML文档:首先,需要将XML文档加载到内存中。
一般情况下,可以通过读取XML文件或者通过网络请求获取XML数据,并将其保存在内存中。
2. 构建DOM树:加载XML文档后,解析器会根据XML的语法规则将其解析成一棵树状结构的节点,也就是DOM树。
DOM树由各种类型的节点组成,包括元素节点、属性节点、文本节点等。
3. 遍历DOM树:通过遍历DOM树,可以访问和操作XML文档的各个部分。
可以通过获取根节点来开始遍历,然后通过节点之间的关系,如父节点、子节点、兄弟节点等,实现对XML元素的访问和操作。
4. 解析和处理节点:在遍历DOM树的过程中,可以根据节点的类型来进行不同的操作。
例如,对于元素节点,可以获取其标签名、属性值,以及子元素等信息;对于属性节点,可以获取其名称和值;对于文本节点,可以获取其内容等。
5. 数据处理和应用:一旦解析和处理XML文档的节点,可以将其应用到实际的业务逻辑中。
例如,可以将解析得到的数据存储到数据库中,或者根据解析结果生成HTML页面等。
DOM解析XML的优点是易于使用和操作,可以轻松地访问和修改XML文档的内容。
然而,由于将整个XML文档加载到内存中,对于大型XML文档来说,会占用较多的内存资源。
另外,由于DOM树的构建需要将所有的节点加载到内存中,对于大型XML文档来说,解析和构建DOM树的过程会相对较慢。
相比于DOM解析,还有一种称为SAX(Simple API for XML)解析的方法。
与DOM不同的是,SAX解析器在读取XML文档时,并不会将整个文档加载到内存中,而是一边读取,一边解析。
Qt中三种解析xml的方式

Qt中三种解析xml的⽅式在下⾯的随笔中,我会根据xml的结构,给出Qt中解析这个xml的三种⽅式的代码。
虽然,这个代码时通过调⽤Qt的函数实现的,但是,很多开源的C++解析xml的库,甚⾄很多其他语⾔解析xml的库,都和下⾯三种解析xml采⽤相同的原理,所以就算你不是学习qt,也可以⼤致参看⼀下代码,对三种解析⽅式有⼀种⼤致的感觉。
先给出xml如下:<?xml version="1.0" encoding="utf-8"?><school><teacher><entry name="Job"><age>30</age><sport>soccer</sport></entry><entry name="Tom"><age>32</age><sport>swimming</sport></entry></teacher><student><entry name="Lily"><age>20</age><sport>dancing</sport></entry><entry name="Keith"><age>21</age><sport>running</sport></entry></student></school>下⾯给出qt中解析xml的三种⽅式,通过解析xml,创建student列表和teacher列表。
使用DOM解析XML文档

节点之间的关系
功能
节点操作
访问节点
JavaScript实现DOM 访问节点 C#实现DOM访问节点
加载XML文档 加载 文档
loadXml()方法加载XML字符串
IE浏览器
Firefox浏览器
XmlDocument xmlDoc = new XmlDocument(); xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); C#语言加载XML字符串 parser=new DOMParser(); xmlDoc.LoadXml(text); xmlDoc.async="false"; xmlDoc=parser.parseFromString(text,"text/xml"); xmlDoc.loadXML(text);
DOM(文档对象模型)定义了访问XML 和 XHTML 等文档的标准 XML DOM 定义了所有 XML 元素的对象和属性,以及访问的方法(接口)
检查文档是否格式良好
XML文档
XML解析器
DOM树
应用程序
加载文档并创建节点树
通过标准接口访问文档
DOM简介 简介
DOM级别(规范)
DOM级别指W3C组织的DOM规范,W3C组织为DOM规范定义了3个级别
解析XML文档 第2章 使用 章 使用DOM解析 解析 文档
课程回顾
如何用DOM4J解析XML

如何⽤DOM4J解析XML认识XML XML是Extensible Markup Language 即可扩展标记语⾔的缩写,是⼀种简单的数据储存语⾔,使⽤⼀系列简单的标记来描述数据<element_name attribute_name="value" .../> // ⾃闭合<element_name attribute_name="value" ...> //对1-String2-<element_name attribute_name="value" .../>3-<element_name attribute_name="value" .../>...</element_name></element_name> 对XML的四种解析 ⽬前常⽤的XML解析技术有4种:(1)DOM DOM是基于XML的树结构来完成解析的,DOM解析XML的⽅式⾮常适⽤于多次访问XML的应⽤程序,但是其⽐较消耗资源;(2)SAX SAX是⼀种基于事件的解析,其主要是为了解决DOM解析的资源消耗问题⽽出现的,其优势是占⽤资源少,内存消耗⼩,⼀般在处理解析数据量⼤的XML⽂档才会使⽤(3)JDOM JDOM的⽬的是直接为JAVA编程服务,利⽤纯Java技术对XML⽂档实现解析⽣成,序列化以及其他操作;(4)DOM4J DOM4J具有性能优异、功能强⼤和易⽤的特点,同时它也是⼀个开放源代码的软件如何⽤DOM4J解析XML数据注:使⽤DOM4J解析XML,依赖于jar包 dom4j和jaxen 实现的步骤: 指定要解析的XML⽂件; 把XML⽂件转换成Document对象; 获取节点属性或⽂本的值。
File xml = new File("xmlfiles/xxx");SAXReader reader = new SAXReader();Document doc = reader.read(xml);//转换为⽂件Element root = doc.getRootElement();//获取节点属性List<Element> elements = root.elements(); //element 节点下⾯举⼀例分别分析xml⽂档 xml⽂档内容如下<?xml version="1.0" encoding="UTF-8"?><root><student id="1"><name>张飞</name><age>999</age><gender>男</gender></student><student id="2"><name>关⽻</name><age>888</age><gender>男</gender></student><student id="3"><name>刘备</name><age>777</age><gender>男</gender></student></root>若要读取XML⽂档中,可以直接⽤字符串输出的⽅式遍历,⾸先获取⼦元素,再遍历⼦元素⽂本//字符串输出for (Element element : elements) {String id = element.attributeValue("id");//获取当前指定⼦元素System.out.print(id+"\t");List<Element> subEs = element.elements();for (Element subE : subEs) {System.out.print(subE.getText()+"\t");//获取当前⼦元素⽂本}System.out.println("\n");}对于⼀个XML⽂档,我们也许需要检索所有的内容,但有时也可能需要检索某⼀固定节点或某⼀个属性,因此我们需要采取不同的检索⽅式 (1)当我们需要检索所有内容时,可以⽤动态数组的形式遍历出来即可; (2)当需要检索某⼀固定节点 Node node = document.selectSingleNode("//nodeName[@attrName = value]"); (3)检索某⼀属性(多节点检索) List<Element> = document.selecNodes("//nodeName[subEleName/text()='value']"); 取⼀分析结果,输出如下//检索固定节点Node node = doc.selectSingleNode("//student[@id=3]");//任意以student为根的节点if (null != node){Element element =(Element)node;String id = element.attributeValue("id");String name = element.elementText("name");String age = element.elementText("age");String gender = element.elementText("gender");Student student = new Student(Integer.parseInt(id),name,Integer.parseInt(age),gender);System.out.println(student);}当我们需要对XML⽂件进⾏改动时,有三种情况分别为新增、删除以及修改(变动过之后必须落盘) (1)新增 Element ele = root.addElement(...); Element subEle = ele.addElement(String nodeName); (2)删除 Element xxx = ... father.renmove(xxx); (3)修改 xxx.attribute(String attrName).setValue(String value); xxx.element(String subName).setText(String text); 下⾯例⼦为删除操作//删除//内存操作Node node = doc.selectSingleNode("//xxx[@id=3]");if (null != node){root.remove(node);//存盘OutputFormat format = OutputFormat.createPrettyPrint();XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream("xmlfiles/kb.xml"),"UTF-8"),format);writer.write(doc);writer.flush();writer.close();}else {System.out.println("⽤户不存在");}。
Qt解析多级xml文件

Qt解析多级xml⽂件⼀、如下图为XML⽂件 annotation为根节点, first第⼀节点,second第⼆节点,third第三节点。
⼆、实现解析xml⽂件,并将解析数据⽤QTreeView显⽰,实现代码如下 ① .h⽂件class ParamSettingDlg : public QDialog{Q_OBJECTpublic:explicit ParamSettingDlg(QWidget *parent = nullptr);~ParamSettingDlg();private:Ui::ParamSettingDlg *ui;QStandardItemModel *model;}; ② cpp⽂件void ParamSettingDlg::LoadClassifyFile(){QDomDocument doc;QString strXMLPath = QApplication::applicationDirPath() + + "/config/classify.xml";model = new QStandardItemModel(ui->treeView);model->setHorizontalHeaderLabels(QStringList()<<QStringLiteral("Classify"));QFile file(strXMLPath);if (!file.open(QIODevice::ReadOnly))return;QString strError;int iErrCount;int iErrLine;if ( !doc.setContent(&file, false, &strError, &iErrLine, &iErrCount) ){LoggerInfo::GetInstance()->WriteLog(LOG_LEVEL_ERROR,"Open XML Failed : " + strError ,__FUNCTION__,__LINE__); file.close();return ;}//! 根节点QDomElement root = doc.documentElement();//⼀级节点QDomElement firstNode = root.firstChildElement("first");for (; !firstNode.isNull(); firstNode = firstNode.nextSiblingElement("first")){QList<QStandardItem*> firstItems;QStandardItem* item1 = new QStandardItem(firstNode.attribute("name"));firstItems.append(item1);model->appendRow(firstItems);ui->comboBox->addItem(item1->text());//⼆级节点QDomElement secondNode = firstNode.firstChildElement("second");for (; !secondNode.isNull(); secondNode = secondNode.nextSiblingElement("second")){QList<QStandardItem*> secondItems;QStandardItem* item2 = new QStandardItem(secondNode.attribute("name"));secondItems.append(item2);item1->appendRow(secondItems);ui->comboBox->addItem(item2->text());//三级节点QDomElement thirdNode = secondNode.firstChildElement("third");for (; !thirdNode.isNull(); thirdNode = thirdNode.nextSiblingElement("third")){QList<QStandardItem*> thirdItems;QStandardItem* item3 = new QStandardItem(thirdNode.attribute("name"));thirdItems.append(item3);item2->appendRow(thirdItems);ui->comboBox->addItem(item3->text());}}}ui->treeView->setModel(model);}三、实现效果图。
Qt采用Dom方式读写XML

Qt采⽤Dom⽅式读写XML XML⽂件如下所⽰:<?xml version="1.0" encoding="GBK"?><Catalog name = "树形⽬录"><View id = "default"><任务年度/><任务编号/><任务名称/></View><View id = "1"><任务名称/><任务年度/><任务编号/></View><View id = "2"><任务年度/><任务名称/><任务编号/></View></Catalog> 读⽂件:if("" == fileName){qDebug()<<"Filename is Null";return;}QFile file(DirectorOf("xml").absoluteFilePath(fileName));if(!file.open(QFile::ReadOnly | QFile::Text))qDebug()<<"open file"<<fileName<<"failed, error:"<<file.errorString();/*解析Dom节点*/QDomDocument document;QString strError;int errLin = 0, errCol = 0;if( !document.setContent(&file, false, &strError, &errLin, &errCol) ) {qDebug()<<"parse file failed at line"<<errLin<<",column"<<errCol<<","<<strError;return;}if( document.isNull() ) {qDebug()<<"document is null !";return;}QDomElement root = document.documentElement();qDebug()<<root.tagName();QDomElement catalogs = root.firstChildElement();if( catalogs.isNull() )return;elseqDebug()<<catalogs.tagName();while(!catalogs.isNull()){QString tag = catalogs.attributeNode("id").value();QStringList child;QPair<QString,QStringList> pair;for(int i = 0;i < catalogs.childNodes().size();i++)child<<catalogs.childNodes().at(i).nodeName();pair.first = tag;pair.second = child;catalogList.append(pair);catalogs = catalogs.nextSiblingElement();}file.close(); 写⼊XMLQFile file(DirectorOf("xml").absoluteFilePath(xmlName));if (!file.open(QFile::ReadOnly | QFile::Text))return false;QString errorStr;int errorLine;int errorColumn;QDomDocument doc;if (!doc.setContent(&file, false, &errorStr, &errorLine, &errorColumn))return false;file.close();QDomElement root = doc.documentElement();if(root.tagName() != "Catalog")return false;QDomElement element = doc.createElement("View");QDomAttr idAttr = doc.createAttribute("id");element.setAttributeNode(idAttr);element.setAttribute("id",typeName);for(int i = 0;i < catalogs.size();i++){QDomElement cataItem = doc.createElement(catalogs.at(i));element.appendChild(cataItem);}root.appendChild(element);/* QDomProcessingInstruction instruction;instruction = doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"GBK\""); doc.appendChild(instruction);*/QFile f(DirectorOf("xml").absoluteFilePath(xmlName));if(!f.open(QFile::WriteOnly | QFile::Text))return false;QTextStream out(&f);doc.save(out,4);f.close();return true;。
QT中DOM的使用

DOM是一种解析由万维网协会(W3C)所开发的XML文档的标准应用程序编程接口。
Qt 提供一套用于读取、操作和编写XML文档的非验证型二级DOM实现。
DOM把XML文件表示成内存中的一棵树。
我们可以按需要遍历这个DOM树,也可以修改这个树并把它作为XML文件保存到磁盘中。
让我们考虑如下这个XML文档:<doc><quote>Scio me nihil scire</quote><translation>I know that I know nothing></translation></doc>它对于如下所示的DOM树:DocumentElement(doc)Element(quote)Text(“Scio me nihil scire”)Element(translation)Text(“I know that I know nothing”)这个DOM树包含不同类型的节点。
例如,Element节点对应打开标签以及与它匹配的关闭标签。
在这两个标签之间的内容则作为这个Element节点的子节点出现。
(注意蓝色字体)上面的介绍主要是用来说明dom树的结构情况,下面则进入正题看如何通过qt来达到修改xml文件的目的。
本文中主要说明如何修改xml属性值以及节点值,修改属性值的代码如下:bool QXmlEdit::SetAValue(const QString &key, const QVariant &value) {try{QString tag;QString attName;QStringList sl=key.split("/");tag = sl.at(0);attName = sl.at(1);QDomElement docElem = doc.documentElement();QDomNodeList nodeList = docElem.elementsByTagName(tag);if (nodeList.count() >0 ){QDomElement el = nodeList.at(0).toElement();el.setAttribute(attName,value.toString());//设置属性值QFile file(fileName);if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {return false;}QTextStream out(&file);doc.save(out,4);}return true;}catch (...){return false;}}修改节点值的代码如下:bool QXmlEdit::SetTValue(const QString &key, const QVariant &value) {try{QDomElement docElem = doc.documentElement();QDomNodeList nodeList = docElem.elementsByTagName(key);if (nodeList.count() >0 ){QDomElement el = nodeList.at(0).toElement(); //tag为key 的节点QDomNode oldnode = el.firstChild(); //标签之间的内容作为节点的子节点出现,得到原来的子节点el.firstChild().setNodeValue(value.toString()); //用提供的value值来设置子节点的内容QDomNode newnode = el.firstChild(); //值修改过后的子节点el.replaceChild(newnode,oldnode); //调用节点的replaceChild方法实现修改功能QFile file(fileName);if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {return false;}QTextStream out(&file);doc.save(out,4);}return true;}catch (...){return false;}}1 QFile file(fileName);2if (!file.open(QFile::ReadOnly | QFile::Text)) {3return false;4 }5 QString errorStr;6int errorLine;7int errorColumn;89 QDomDocument doc;10if (!doc.setContent(&file, false, &errorStr, &errorLine, &erro rColumn)) {11return false;12 }1314 QDomElement root = doc.documentElement();15if (root.tagName() != "root") {16return false;17 }18 parseElement(root);19 file.close();获取跟节点,然后把这个根节点交给其他函数去解析就OK然后是写xml1 QFile file(fileName);2if (!file.open(QFile::ReadOnly | QFile::Text))3return false;4 QString errorStr;5int errorLine;6int errorColumn;7 QDomDocument doc;8if (!doc.setContent(&file, false, &errorStr, &errorLine, &erro rColumn))9return false;1011 file.close();1213 QDomElement root = doc.documentElement();14if (root.tagName() != "root")15return false;1617 QDomElement element = doc.createElement("file");1819 QDomElement el_address = doc.createElement("address");20 QDomText text_address = doc.createTextNode(address);21 el_address.appendChild(text_address);2223 element.appendChild(el_address);2425 QDomElement el_path = doc.createElement("path");26 QDomText text_path = doc.createTextNode(path);27 el_path.appendChild(text_path);2829 element.appendChild(el_path);3031 root.appendChild(element);3233 QFile f(fileName);34if (!f.open(QFile::WriteOnly | QFile::Text))35return false;363738 QTextStream out(&f);39// element->save(out, 3);40 root.save(out, 3);41// doc.save(out, 3);42 f.close();这里所有需要append的字节点只能由QDomDocument对象create,而不能直接new它,否则永远也看不到新添加的节点,另外,读取和写入的文件流必须创建两个,否则必然回将需要写入的文档继续在原来人当的后面,造成多个根节点。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Qt中使用DOM对XML进行的各种解析(总结)
前几天因为底层拓扑结构发生了变化,导致拓扑文件发生了变化,我负责的对于拓扑文件的解析操作自然也就要推到重来。
利用上个周末的时间,把这个任务搞定了,顺便也利用这个时间好好总结下这次学到的知识。
我们知道,QT中对于XML文件的读写无非就两种方式,DOM和SAX,两种方法的具体介绍如下:
/***************************************我是传说中的分割线**************************************************************/
用于读取和操作XML 文件的标准是文档对象模型DOM。
DOM为XML 文档的已解析版本定义了一组接口。
解析器读入整个文档,然后构建一个驻留内存的树结构,然后您的代码就可以使用DOM 接口来操作这个树结构。
您可以遍历树以了解原始文档包含了什么,您可以删除树的几个部分,还可以重新排列树和添加新的分支,等等。
遗憾的是,因为DOM 方法涉及读取整个文件并将该文件存储在一个树结构中,而这样可能是低效的、缓慢的,并且很消耗资源:
DOM 构建整个文档驻留内存的树。
如果文档很大,就会要求有极大的内存。
DOM 创建表示原始文档中每个东西的对象,包括元素、文本、属性和空格。
如果您只需关注原始文档的一小部分,那么创建那些永远不被使用的对象是极其浪费的。
DOM 解析器必须在您的代码取得控制权之前读取整个文档。
对于非常大的文档,这会引起显著的延迟。
这些仅仅是由文档对象模型的设计引起的问题;撇开这些问题,DOM API 是解析XML 文档非常有用的方法。
一种替代技术就是SAX。
相比于文档对象模型DOM,SAX 是读取和操作XML 数据的更快速、更轻量的方法。
SAX 允许您在读取文档时处理它,从而不必等待整个文档被存储之后才采取操作。
它不涉及DOM所必需的开销和概念跳跃。
SAX API是一个基于事件的API,适用于处理数据流,即随着数据的流动而依次处理数据。
SAX API 在其解析您的文档时发生一定事件的时候会通知您。
在您对其响应时,您不作保存的数据将会被抛弃。
/***************************************我是华丽的分割线**********************************************************************/
我们可以看到,如果所要读取的XML文件不是很大,采用DOM读取方法还是很便捷的,由于我用的也是DOM树读取的方法,所以,本文所介绍的也主要是基于DOM的方法读取。
根据常用的操作,我简单的把对XML的操作分为以下几类:
1 首先对XML文件进行操作,打开文件。
这个其实就是对文件进行操作,可以把它直接定义为构造函数,在对对象进行初始化时完成。
TopoDataReader::TopoDataReader(const wstring &filePath):_filePath(filePath),_qDomDoc("mydocument"),_qFile(QString::fromStdWString(fileP ath))
{
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>
</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("snmpip"));//network的也是如此方法获取对于第二种情况,采用如下方法:
直接调用text() API就可以了
string ip=qPrintable(elementnodeip.text());
但是,假设文件中有多个同样的节点,如下
<a>
<b></b>
<b></b>
</a>
这样用elementsByTagName("b")返回的就是一个childNodes()而不是一个单独的node了。
我们可以使用at()方法具体定位。
另外,我们还可以使用这样一种方法获取节点的值,假设XML文件如下
+<switch snmpIp="192.168.120.251"network="front">
<name>前端主交换机</name>
<description/>
<ipList>
<ip>192.168.120.251</ip>
</ipList>
<rwCommunity>public@120</rwCommunity>
<workMode>true</workMode>
<workStatus>true</workStatus>
<enableAlarm>true</enableAlarm>
<snmpCount>0</snmpCount>
<memoryUtilizationRatio>50.0</memoryUtilizationRatio>
<cpuUtilizationRatio>50.0</cpuUtilizationRatio>
<port>161</port>
<snmpStatus>true</snmpStatus>
<privateName>CZ-5_FA</privateName>
<switchIndex>topLeft</switchIndex>
</switch>
我们可以先获取switch节点,然后得到其childNodes(),于是就可以使用at()方法来获取下面的每个节点了(注:从0开始)
比如说,上面的那个ip节点就是nodeswitch.childNodes().at(3)。
这样做得好处就是不用担心重复的问题,只要你确定switch节点确定对了,底下的也就一定能确定了。
3 返回某个节点下子节点的个数
这个简单,也是直接调API
QDomElement docElem = _qDomDoc.documentElement();
QDomNode nodetagname=docElem.elementsByTagName(tagname).at(0);//假设有多个tagname此处选第一个
int num=nodetagname.childNodes().size();
好了,临时想起来就这么多。
以后想起来再添。