一、QXmlStreamReader
用于读取格式良好的xml文档的快速解析器;解析步骤
QXmlStreamReader reader;
QFile file(fileName);
reader.setDevice(&file);
如上将xml文件加载到reader中;也可以直接 QXmlStreamReader reader(&file);
接下去可以遍历xml节点;通过 reader.readNext(); 顺序遍历每一个节点;返回的类型可以有
Invalid,
StartDocument,
EndDocument,
StartElement,
EndElement,
Characters,
Comment,
DTD,
EntityReference,
ProcessingInstruction
也可以通过判断是否是自己想要的类型如: reader.atEnd()、reader.isEndElement()、reader.isStartElement()等类型判断是否到自己想要的位置;atEnd是指当前层的节点已经遍历完了;isEndElement是指当前节点已经遍历了(主要是指子节点也遍历完了)
reader.name()获取到当前节点的名字;reader.attributes().value("term").toString()获取指定属性的值,如term属性的值;reader.readElementText()则是读取节点的text;
例如读取如下的xml数据:
<entry term="sidebearings"> <page>10</page> </entry>
1、readNext读取到<entry term="sidebearings">;然后通过reader.attributes().value("term").toString()则会返回sidebearings;
2、readNext读取到“\n ”这里我用双引号标出来;则readNext返回的type是Characters
3、readNext读取到的是<page>10</page>;然后通过reader.readElementText()读取到10这个字符串;
4、readNext读取到“\n”,readNext返回的type是Characters
5、readNext读取到的是</entry>;readNext返回的类型是EndElement
6、readNext读取到“”,其实啥都没有读取到,返回的类型是EndElement,但是atEnd标记的是true;(这里不管读到的是还有其他字符与否,atEnd都直接标记true)
二、DOM
是一种解析由万维网协会(W3C)所开发的xml文档的标准应用程序编程接口。
QDomDocument doc; doc.setContent(&file, false, &errorStr, &errorLine, &errorColumn); QDomElement root = doc.documentElement(); QDomNode child = root.firstChild(); //然后遍历当前层的所有孩子 while (!child.isNull()) { if (child.toElement().tagName() == "entry") parseEntryElement(child.toElement(),treeWidget->invisibleRootItem()); child = child.nextSibling(); }
1、声明一个文档的dom:doc
2、然后doc.setContent则是解析了整个xml文件;接下去无需再读取文件的操作。
3、获取doc的QDomElement,即获取xml的第一层的element
4、然后获取root.firstChild()获取第一层element的子节点,将子节点当成一个node;当要查找下一个兄弟节点,则是 child.nextSibling();
5、将node抓换成element
。。。。然后遍历递归所有子节点;
element.attribute("term")获取属性term的值;如果有多个属性的时候,可以通过
QDomNamedNodeMap node_map = element.attributes(); foreach (QDomNode node, node_map) { QDomAttr atr = node.toAttr(); atr.value(); atr.name(); }
获取所有的属性,然后遍历所有的属性;也可以通过node_map.namedItem(const QString& name)来获取对应的QDomNode
要获取对应的标签名字:child.toElement().tagName()
原文:https://www.cnblogs.com/czwlinux/p/12404826.html