Qt中使用DOM对XML进行的各种解析

合集下载

QDomDocument读取和编辑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解析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的方式

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文档

使用DOM解析XML文档
parentNode childNodes firstChild lastChild nextSibling previousSibling 获取父节点 获取子节点集合 获取第一个子节点 获取最后一个子节点 获取同级别中后一个节点 获取同级别中前一个节点
节点之间的关系
功能
节点操作
访问节点
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

如何⽤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文件

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

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的使用

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它,否则永远也看不到新添加的节点,另外,读取和写入的文件流必须创建两个,否则必然回将需要写入的文档继续在原来人当的后面,造成多个根节点。

Qt之xml文件解析

Qt之xml文件解析

Qt之xml⽂件解析XML⽂件简介XML - EXtensible Markup Language,可拓展标记语⾔Qt中加载XML模块.pro ⽂件中添加QT += xmlQt的XML访问⽅式引⽤:Qt 提供了两种访问 XML ⽂档的⽅式:DOM 和 SAX。

DOM ⽅式:将 XML ⽂档转换为树形结构存储到内存中,再进⾏读取,消耗的内存⽐较多。

此外,由于⽂档都已经存储到内存,所以需要频繁实现修改等操作时,使⽤起来⽐较⽅便。

SAX ⽅式:相⽐于 DOM,SAX 是⼀种速度更快,更有效的⽅法,它逐⾏扫描⽂档,⼀边扫描⼀边解析(由于应⽤程序只是在读取数据时检查数据,因此不需要将数据存储在内存中,这对于⼤型⽂档的解析是个巨⼤优势)。

⽽且相⽐于DOM,SAX 可以在解析⽂档的任意时刻停⽌解析。

但操作复杂,很难修改 XML 数据。

DOM类描述QDomAttr表⽰⼀个 QDomElement 的属性QDomCDATASection表⽰⼀个 XML CDATA 部分QDomCharacterData表⽰ DOM 中的⼀个通⽤字符串QDomComment表⽰⼀个 XML 注释QDomDocument表⽰⼀个 XML ⽂档QDomDocumentFragment QDomNodes 树,通常不是⼀个完整的 QDomDocumentQDomDocumentType表⽰⽂档树中的 DTDQDomElement表⽰ DOM 树中的⼀个元素QDomEntity代表⼀个 XML 实体QDomEntityReference代表⼀个 XML 实体引⽤QDomImplementation DOM 实现的功能的信息QDomNamedNodeMap包含⼀个节点集合,节点可以通过名字来访问QDomNode⼀个 DOM 树中所有节点的基类QDomNodeList QDomNode 对象列表QDomNotation代表⼀个 XML 表⽰法QDomProcessingInstruction代表 XML 处理指令QDomText表⽰解析的 XML ⽂档中的⽂本数据说明:XML的每级元素(QDomElement),也可以称之为结点(QDomNode),QDomElement继承⾃QDomNode;QDomNode可以使⽤toElement()⽅法转换成QDomElement;常⽤⽅法QDomDocument doc("test_xml");QFile xml_file("FiltersConf.xml");if(!doc.setContent(&xml_file)) //也可以传⼊字符串{qDebug()<<"set content fail";return 0;}QDomElement root_element = doc.documentElement();//获取xml⽂件的根元素qDebug()<<root_element.tagName(); //使⽤tagName()⽅法获取元素的标签名QDomNode node = root_element.firstChild();//获取第⼀个⼦结点QString attr = node.toElement().attribute("name");//获取属性while(!node.isNull()){qDebug()<<"-"<<node.toElement().tagName();node = node.nextSibling(); //获取同级的结点}写⼊XMLQDomDocument document;//xml头部的<?xml version="1.0" encoding="UTF-8"?>QDomProcessingInstruction instruction = document.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\""); document.appendChild(instruction);QDomElement root_node = document.createElement("transpond");//创建根结点document.appendChild(root_node); //添加根结点QDomElement element = document.createElement("machine");//创建元素结点element.setAttribute("type", "machine");root_node.appendChild(element);//元素结点添加到根结点下QDomElement item_element = document.createElement("machine-item");//创建item结点item_element.setAttribute("type", "11");item_element.setAttribute("name", "22");item_element.setAttribute("device-code", "33");item_element.setAttribute("ip", "44");item_element.setAttribute("sync-time", "55");//写⼊⽂件QFile file(pConfigManager->GetMachineInfoFile());if(!file.open(QIODevice::ReadWrite | QIODevice::Truncate)){return false;}QTextStream in(&file);document.save(in, 4);file.close();。

简单的Dom4j解析XML

简单的Dom4j解析XML

简单的Dom4j解析XMLXML的格式如下:<Data> <User Count="2"> <User> <P>2017-01-31</P> <A1>A</A1> <A2>B</A2> </User> <User> <P>2017-01-31</P> <A1>A</A1> <A2>B</A2> </User></Data>使⽤Dom4j解析XML获取所有User节点下⾯的节点值。

代码如下:try {DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = null;builder = builderFactory.newDocumentBuilder();Document document = builder.parse(String.valueOf(URL));//URL是指向XML的URLif (document != null) {Element rootElement = document.getDocumentElement();NodeList OwnerNodeList = rootElement.getElementsByTagName("User");int LengthOwnerNodeList = OwnerNodeList.getLength();//获取User节点的个数for (int i = 0; i<LengthOwnerNodeList ; i++) //转换User节点为⼀个Element节点。

初识---Qt解析XML文件(QDomDocument)

初识---Qt解析XML文件(QDomDocument)

初识---Qt解析XML⽂件(QDomDocument)关于XML及其使⽤场景不在此多做介绍,今天主要介绍Qt中对于XML的解析。

QtXml模块提供了⼀个读写XML⽂件的流,解析⽅法包含DOM和SAX,两者的区别是什么呢? DOM(Document Object Model):将XML⽂件保存为树的形式,操作简单,便于访问。

SAX(Simple API for XML):接近于底层,速度较快,但不便于访问。

建议阅读:这篇博客,最好做⼀下试验!因为下vs2013下开发Qt有些库需要⼿动添加!!!QXml,QSql,,⼀般出现这个问题都是库⽂件没有添加造成,这⾥使⽤QtNetwork就要加QtNetwork的库⽂件,在debug模式下需要加Qt5Networkd.lib库⽂件,在release模式下需要加QtNetwork5.lib库⽂件在哪⾥添加呢,⼀共有两个地⽅需要添加,缺⼀不可1. 项⽬->属性->c/c++->常规->附加包含⽬录->在弹出的对话框中,点那个⽂件夹形状的按钮添加新⾏,输⼊$(QTDIR)\include\QtNetwork2. 项⽬->属性->连接器->输⼊->附加依赖项,添加 Qt5Networkd.lib(debug模式)或者 Qt5Network.lib(release模式)person.xml⽂件如下所⽰:解析⽅法:void ParseXML::parse(QString file_name){if(file_name.isEmpty())return;QFile file(file_name);if(!file.open(QFile::ReadOnly | QFile::Text)){QMessageBox::information(NULL, QString("title"), QString("open error!"));return;}QDomDocument document;QString error;int row = 0, column = 0;if(!document.setContent(&file, false, &error, &row, &column)){QMessageBox::information(NULL, QString("title"), QString("parse file failed at line row and column") + QString::number(row, 10) + QString(",") + QString::number(column, 10));return;}if(document.isNull()){QMessageBox::information(NULL, QString("title"), QString("document is null!"));return;}QDomElement root = document.documentElement();//root_tag_name为personsQString root_tag_name = root.tagName();if(root.hasAttribute("name")){//name为QtQString name = root.attributeNode("name").value();}//获取id="1"的节点QDomElement person = root.firstChildElement();if(person.isNull())return;QString person_tag_name = person.tagName();//id为1QString id = person.attributeNode("id").value();//获取⼦节点,数⽬为2QDomNodeList list = root.childNodes();int count = list.count();for(int i=0; i{QDomNode dom_node = list.item(i);QDomElement element = dom_node.toElement();//获取id值,等价QString id_1 = element.attributeNode("id").value();QString id_2 = element.attribute("id");//获取⼦节点,数⽬为4,包括:name、age、email、websiteQDomNodeList child_list = element.childNodes();int child_count = child_list.count();for(int j=0; j{QDomNode child_dom_node = child_list.item(j);QDomElement child_element = child_dom_node.toElement();QString child_tag_name = child_element.tagName();QString child__tag_value = child_element.text();}}//按照name、age、email、website的顺序获取值QDomElement element = person.firstChildElement();while(!element.isNull()){QString tag_name = element.tagName();QString tag_value = element.text();element = element.nextSiblingElement();}}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读取XML详解(转)

QT读取XML详解(转)

QT读取XML详解(转)用Qt中的QDomDocument类处理XML文件XML,全称为扩展标记语言(extensible markup language).是一种非常方便的数据交换工具。

现在Blog的订阅系统输出格式就是满足XML规范的RSS格式,还有SVG矢量图形也使用了XML格式。

我们在取得一个XML格式的文件后,需要作句法分析去提取发布方提供的信息。

而Qt为XML提供了很好的支持,包括DOM的实现和SAX的实现。

DOM 是Document Object Model的简称,其实现方式是将整个文档当作一个对象来装入内存进行处理,然后开发者可以访问这个对象中的每一个节点,每一个节点对应XML文件里的一个标记。

这种方式的优点是操作非常简单,缺点是需要将整个文件放入内存,不适合处理过大文件。

这种方式在Qt中的实现类是QDomDocument,也是本文将要讲解的。

以Blog为代表的RSS文件都不会很大,适合用这种方式来处理。

SAX是Simple API for XML的简称,其实现方式是按阶段将文档读取到内存中,在碰到标签或者其它阶段的时候,调用开发者预先设计好的回调函数去处理。

这种方式的缺点是需要开发者写回调函数去处理不同标签,代码复杂一些,优点是能处理很大的XML文件。

这种方式在Qt中的实现类叫QXmlStreamReader。

——————分割线以下,代码讲解———-1)如果需要使用QDomDocument,那么请在你的项目.pro文件里加上一句”QT += xml”,不然无法编译通过。

2)QDomDocument doc;QFile file("rss.xml");QString errorStr;int errorLine; int errorCol;//setContent是将指定的内容指定给QDomDocument解析,//第一参数可以是QByteArray或者是文件名等if(!doc.setContent(&file,true,&errorStr,&errorLine,&errorCol)){ //如果出错,则会进入这里。

如何使用DOM解析XML文件

如何使用DOM解析XML文件

如何使用DOM解析XML文件DOM(Document Object Model)是一种用于解析和处理XML文件的常用技术。

DOM API允许开发者以树形的数据结构方式访问和操作XML文件的内容。

1.导入DOMAPI:首先,你需要在你的代码中导入DOMAPI相关的类和方法。

在大多数编程语言中,都有现成的DOM库可供使用。

3. 加载XML文件:将要解析的XML文件加载到解析器中,可以使用解析器的`load(`或`parse(`方法,这个方法会将XML文件读取到内存中。

4. 创建一个DOM树:通过调用解析器的`getDocument(`或`parse(`方法,可以获取解析器对XML文件进行解析后的DOM树对象。

5. 获取根节点:通过DOM树对象的`getDocumentElement(`方法,可以获取XML文件的根节点。

6. 遍历子节点:通过DOM树对象的`getChildNodes(`方法,可以获取根节点的所有子节点。

然后,你可以使用循环遍历这些子节点,获取它们的内容和属性,并进一步操作。

7. 获取节点内容:通过DOM树节点对象的`getNodeValue(`方法,可以获取节点的文本内容。

如果节点有子节点,可以使用`getChildNodes(`方法获取它们的内容。

8. 获取节点属性:通过DOM树节点对象的`getAttribute(`方法,可以获取节点的属性值。

你需要在括号中指定要获取的属性名称。

9. 修改节点内容:通过DOM树节点对象的`setNodeValue(`方法,可以修改节点的文本内容。

10. 修改节点属性:通过DOM树节点对象的`setAttribute(`方法,可以修改节点的属性值。

你需要在括号中指定要修改的属性名称和新值。

11. 创建新节点:通过DOM树节点对象的`createElement(`方法,可以创建一个新节点对象。

你需要在括号中指定节点名称。

12. 添加节点:通过DOM树节点对象的`appendChild(`方法,可以将新节点添加为现有节点的子节点。

dom解析xml文件的案例

dom解析xml文件的案例

dom解析xml文件的案例DOM (Document Object Model) 是一种用于解析和操作 XML 文件的标准。

它将 XML 文件表示为一个树状结构,其中每个节点都是一个对象,可以通过 DOM 提供的方法和属性来访问和修改节点的内容。

下面列举了十个使用 DOM 解析 XML 文件的案例,以帮助读者更好地理解和应用 DOM 技术。

1. 读取 XML 文件:使用 DOM 可以将 XML 文件加载到内存中,并以树状结构表示。

通过遍历这个树状结构,可以访问和提取 XML 文件的内容。

2. 导航节点:DOM 提供了一系列方法来导航 XML 文件中的节点,例如获取父节点、子节点、兄弟节点等。

这些方法使得在 XML 文件中定位和操作节点变得非常方便。

3. 获取节点的属性:在 XML 文件中,节点可以拥有一些属性,这些属性用来描述节点的特征和特性。

使用 DOM,可以轻松获取节点的属性值,并根据这些属性值进行进一步的处理。

4. 修改节点的内容:DOM 允许修改 XML 文件中节点的内容。

可以使用 DOM 提供的方法来修改节点的文本内容、属性值等信息,从而实现对 XML 文件的动态更新。

5. 创建新节点:使用 DOM,可以创建新的节点并将其添加到 XML文件中。

可以使用 DOM 提供的方法来创建元素节点、文本节点、属性节点等,并通过操作来实现节点的插入、删除等操作。

6. 删除节点:DOM 允许删除 XML 文件中的节点。

可以使用 DOM 提供的方法来删除指定的节点,从而实现对 XML 文件的内容进行清理和精简。

7. 解析 CDATA 节点:CDATA 节点是一种特殊的节点,它用于存储XML 文件中的文本内容,这些内容可能包含一些特殊字符。

使用DOM,可以轻松解析 CDATA 节点,并获取其中的文本内容。

8. 解析命名空间:XML 文件中可以使用命名空间来区分不同的元素和属性。

使用 DOM,可以解析命名空间,并通过命名空间来访问和操作 XML 文件中的元素和属性。

qt 解析xml报文的方法

qt 解析xml报文的方法

qt 解析xml报文的方法【原创版4篇】篇1 目录1.引言2.Qt 解析 XML 报文的方法3.Qt 解析 XML 报文的应用4.结论篇1正文Qt 解析 XML 报文的方法Qt 是一个流行的 C++ 框架,它提供了许多功能强大的类和库,用于解析和生成 XML 文档。

下面介绍一些解析 XML 报文的方法。

1.使用 QDomDocument 类解析 XML 文档QDomDocument 类是 Qt 中用于解析和操作XML 文档的核心类之一。

使用 QDomDocument,可以轻松地解析 XML 文档并提取所需的数据。

下面是一个简单的示例代码:```cppQDomDocument doc;if (doc.setContent(xmlString)) {QDomElement root = doc.documentElement();// 处理根元素}```2.使用 QDomElement 类获取 XML 文档中的元素QDomElement 类表示 XML 文档中的元素节点。

使用 QDomElement,可以轻松地获取 XML 文档中的元素节点,并对其进行操作。

下面是一个简单的示例代码:```cppQDomElement element = doc.documentElement();QDomNodeList children = element.childNodes();for (int i = 0; i u003c children.count(); i++) {QDomNode child = children.at(i);if (child.isElement()) {QDomElement childElement = child.toElement();// 处理子元素}}```3.使用 QDomXPath 类查询 XML 文档中的元素QDomXPath 类提供了使用XPath表达式查询 XML 文档的能力。

用DOM实现对XML文件的解析

用DOM实现对XML文件的解析

⽤DOM实现对XML⽂件的解析DOM 解析器介绍DOM的 xml.dom.minidom ⼦模块、xml.dom.pulldom ⼦模块分别提供两种形式的解析器。

xml.dom.minidom ⼦模块主要提供对 XML ⽂档的读、修改操作,解析器的使⽤格式如下:xml.dom.minidom.parse(filename_or_file,parse=None,bufsize=None)该解析器解析成功,返回指定 XML ⽂件的⼀个⽂档对象。

本⽂⽤到的 DOM 对象的相关函数介绍1.1 Node 接⼝对象相关函数Node.childNodes,返回当前节点中包含的节点列表,这是⼀个只读属性。

1.2 Document 接⼝对象相关函数Document.documentElement,返回⽂档的所有元素。

Document.getElementsByTagName(tagName),搜索所有具有特定元素类型名称下的⼦元素,返回元素集合。

1.3 Element 接⼝对象相关函数Element.hasAttribute(name),如果元素具有按指定 name 命名的属性,返回True。

Element.getAttribute(name),以字符串形式返回指定 name 命名的属性的值,如果不存在这样的标签,则返回空字符串。

Element.setAttribute(name,value),设置 name 标签指定的值。

Element.removeAttribute(name),删除 name 标签指定的元素。

⽂件解析⽰例1、 XML⽂件(movies.xml)<collection shelf="New Arrivals"><movies title="Enemy Behind"><type>War, Thriller</type><format>DVD</format><year>2003</year><rating>PG</rating><stars>10</stars><description>Talk about a US-Japan war</description></movies></collection>2、 DOM解析XML⽂件(sax_movie.py)from xml.dom.minidom import parseimport xml.dom.minidom# 使⽤minidom解析器打开 XML ⽂档DOMTree = xml.dom.minidom.parse('D:\\My-python\\XML\\movies.xml')# 该解析器解析成功,返回⼀个⽂档对象DOMTree接收collection = DOMTree.documentElement # 把所有的元素存⼊集合中print(collection.toxml())if collection.hasAttribute("shelf"):print ("Root element : %s" % collection.getAttribute("shelf"))# 获取movie元素下的⼦元素集合movies = collection.getElementsByTagName("movies")movies_record = []# 打印每部电影的详细信息for movie in movies:if movie.hasAttribute("title"): # 判断是否存在title属性movies_record.append(movie.getAttribute("title")) # 获取属性对应的值type = movie.getElementsByTagName('type')[0] # 获取 type 标签对应的元素movies_record.append(type.childNodes[0].data) # 获取 type 元素对应的值format = movie.getElementsByTagName('format')[0]movies_record.append(format.childNodes[0].data)rating = movie.getElementsByTagName('rating')[0]movies_record.append(rating.childNodes[0].data)stars = movie.getElementsByTagName('stars')[0]movies_record.append(stars.childNodes[0].data)description = movie.getElementsByTagName('description')[0]movies_record.append(description.childNodes[0].data)print(movies_record)3、运⾏结果<collection shelf="New Arrivals"><movies title="Enemy Behind"><type>War, Thriller</type><format>DVD</format><year>2003</year><rating>PG</rating><stars>10</stars><description>Talk about a US-Japan war</description></movies></collection>Root element : New Arrivals['Enemy Behind', 'War, Thriller', 'DVD', 'PG', '10', 'Talk about a US-Japan war'] DOM实现对XML⽂件内容的修改1、代码(DOM_edit_XML.py)from xml.dom.minidom import parseimport xml.dom.minidom# 使⽤minidom解析器打开 XML ⽂档DOMTree = xml.dom.minidom.parse('D:\\My-python\\XML\\movies.xml')# 该解析器解析成功,返回⼀个⽂档对象DOMTree接收# 把所有的元素存⼊集合中collection = DOMTree.documentElement# 获取 stars 的 NodeList 对象集合stars = collection.getElementsByTagName("stars")stars_object = stars[0] # 获取列表第⼀个price节点(元素)stars_object.firstChild.data = 12 # 修改第⼀个节点的值print('修改数量成功!')# 获取 movies 的 NodeList 对象集合movies = collection.getElementsByTagName("movies")collection.removeChild(movies[1])print('删除节点成功')f = open('D:\\My-python\\XML\\movies.xml','w',encoding='utf-8')f.write(DOMTree.toxml())f.close()2、修改结果<?xml version="1.0" ?><collection shelf="New Arrivals"><movies title="Enemy Behind"><type>War, Thriller</type><format>DVD</format><year>2003</year><rating>PG</rating><stars>12</stars><description>Talk about a US-Japan war</description></movies></collection>。

qdomdocument用法

qdomdocument用法

QDomDocument是Qt中用于处理XML文档的类,它提供了一种简单而强大的方式来解析、创建和编辑XML文档。

在Qt中,QDomDocument类是一个重要的工具,可以帮助开发者快速高效地处理XML数据。

本文将介绍QDomDocument类的基本用法,包括创建、解析、遍历和修改XML文档。

一、创建QDomDocument对象在使用QDomDocument类之前,首先需要创建一个QDomDocument对象。

创建QDomDocument对象的方法如下:```cppQDomDocument doc;```这样就创建了一个名为doc的QDomDocument对象,接下来可以使用该对象来处理XML文档。

二、解析XML文档使用QDomDocument类可以方便地解析一个XML文档。

通常情况下,可以从一个文件或者字符串中加载XML数据,然后解析成QDomDocument对象。

```cppQFile file("example.xml");if (file.open(QIODevice::ReadOnly)) {if (doc.setContent(file)) {// 解析成功}file.close();}```上面的代码展示了如何使用QFile来加载XML文件,并将其解析成QDomDocument对象。

如果文件加载和解析成功,则可以继续对XML文档进行操作。

三、遍历XML文档遍历XML文档是处理XML数据的常见操作之一。

QDomDocument 类提供了一系列方法来遍历XML文档的节点。

```cppQDomElement root = doc.documentElement(); QDomNodeList nodes = root.elementsByTagName("node"); for (int i = 0; i < nodes.size(); ++i) {QDomElement node = nodes.at(i).toElement();// 对节点进行操作}```上面的代码展示了如何获取XML文档的根节点,并遍历其子节点。

实验7DOM对xml进行访问与操作

实验7DOM对xml进行访问与操作

实验7 DOM对XML进行访问与操作
【开发语言及实现平台或实验环境】
配置有windows记事本、写字板或XML Writer开发环境的计算机设备
【实验目的】
(1)理解应用程序访问与操作XML文档的过程
(2)掌握用DOM创建XML文档的步骤
(3)掌握DOM常用类的使用方法
【实验要求】
(1)实现一个应用程序利用DOM技术对xml文档的访问
(2)实现一个应用程序利用DOM技术对xml文档的操作
【实验原理】
一数据岛是存在于HTML网页中的XML代码段
二数据岛通过在HTML网页中使用<XML>标记使HTML与XML的优势互部
【实验步骤】
[实验内容]
1编写程序,解析如下的XML文件,要求输出的结果如图8-1所示。

图8-1 程序运行结果
2、编写程序,修改下面的XML文件Book.xml,要求:
(1)为每一个book元素添加一个price子元素,元素内容自定。

(2)修改title元素的值,在文本内容的后面添加文本“(电子工业出版社)”。

例如:
<title> Java面向对象编程</title> 变为:
<title> Java面向对象编程(电子工业出版社)</title>
(3)删除原有的第三个<book>元素。

qt xml elementbyid用法

qt xml elementbyid用法

qt xml elementbyid用法在QT中,我们常常需要与XML文件进行交互,尤其是当我们需要从XML文件中获取特定的元素时。

这种情况下,ElementByID方法就显得尤为重要。

下面,我将详细介绍QT中XMLElementByID的用法。

一、XML文件解析首先,我们需要解析XML文件。

QT提供了一个名为QDomDocument的类,用于解析XML文件。

QDomDocument提供了几种方法来获取XML文档的各个部分,其中最常用的是getElementById方法。

使用getElementById方法获取XML元素的基本步骤如下:1.创建QDomDocument对象并加载XML文件。

2.使用QDomDocument对象的getElementById方法,传入要查找的元素的ID 作为参数。

3.返回的结果是一个QDomNode对象,表示找到的元素。

下面是一个简单的示例代码:```cpp#include<QDomDocument>#include<QDebug>intmain(){//创建QDomDocument对象并加载XML文件QDomDocumentdoc;QStringxmlFilePath="your_xml_file.xml";//替换为你的XML文件路径if(!doc.load(xmlFilePath)){qDebug()<<"FailedtoloadXMLfile:"<<xmlFilePath;return-1;}//使用getElementById方法获取元素QStringelementId="your_element_id";//替换为你要查找的元素的IDQDomElementelement=doc.getElementById(elementId);if(element.isNull()){qDebug()<<"Elementnotfound:"<<elementId;return-1;}//输出找到的元素内容qDebug()<<"Foundelement:"<<element.tagName();//替换为元素的标签名return0;}```请注意,此代码片段仅适用于已知元素的ID并需要获取其内容的情况。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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();
好了,临时想起来就这么多。

以后想起来再添。

相关文档
最新文档