zoukankan      html  css  js  c++  java
  • 用 Qt 中的 QDomDocument类 处理 XML 文件(上)

     

    我们可以看到,如果所要读取的XML文件不是很大,采用DOM读取方法还是很便捷的,由于我用的也是DOM树读取的方法,所以,本文所介绍的也主要是基于DOM的方法读取。

    根据常用的操作,我简单的把对XML的操作分为以下几类:

    1 首先对XML文件进行操作,打开文件。

    这个其实就是对文件进行操作,可以把它直接定义为构造函数,在对对象进行初始化时完成。

    TopoDataReader::TopoDataReader(const wstring &filePath):_filePath(filePath),_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>

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

    好了,临时想起来就这么多。以后想起来再添。

    //============================================================================================================================

    Qt学习之XML读写操作小结


    在“QQ便签”项目组中我负责有关后台XML操作的实现部分,现在对在项目中用到的XML的相关操作进行简单的小结。

    这几天搜集qt对XML格式文件的读写,着重于DOM这种方式,先将搜集的资料粘贴在下面, 以一个完整的流程:
    =======如下:============


    我们知道对XML的操作有两种方法,即DOM方式和SAX方式。二者主要区别是:DOM实现方式操作非常简单,但不适合处理过大文件;而SAX实现方式是能处理很大的XML文件,但是需要开发者写

    一些复杂的代码。Qt提供了对应于这两种用于读取、操作和编写XML的实现类,分别是QDomDocument类和QXmlStreamReader类,由于在项目中涉及的文件不大,因此我们选用QDomDocument类来

    处理。

  • 相关阅读:
    go 排序sort的使用
    MySQL 创建索引
    jenkins 解决构建成功后进程消失的问题
    go redigo的简单操作
    go 实现struct转map
    MySQL写入用户微信名
    MySQL简单优化
    python 定时修改数据库
    go 实现简单的加权分配
    python 遇到的小坑
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/4102519.html
Copyright © 2011-2022 走看看