Qt Gui 第十六章

一、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这个字符串;

扫描二维码关注公众号,回复: 9559657 查看本文章

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()

猜你喜欢

转载自www.cnblogs.com/czwlinux/p/12404826.html
今日推荐