设为首页 加入收藏

TOP

QDomDocument 读取和编辑xml文件(一)
2019-07-06 18:09:24 】 浏览:83
Tags: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对象和一个空标签。1

我们对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 01
    QDomElement root = doc.documentElement();

    QDomNode node=  root.firstChild();
    qDebug() << root.attributeNode("category").value();
    while(!node.isNull())
    {
       qDebug() << "xx";
       node = node.nextSibling();
    }

结果会输出几个xx呢?

代码做出如下更改

  • code 02
    QDomElement 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

到这里,大家应该就能明白两者的区别了。也应该能读懂上边的

QDomNode调用toElement()以把它转化成QDomElement,然后调用tagName()来获得元素的标签名称。如果节点不是Element类型,那么toElement()函数就返回一个空QDomElement对象和一个空标签

[========]

QDomElemet 与 QDomAttr QDomText

经过上面的试验,我们还可以得到另一个结论,那就是
属性不是QDomELement子QDomELement
属性不是QDomNode子QDomNode

还有一件事我们不知道,那就是QDomELement中的文本算是它的子QDomELement么?

<bookstore category="xml">hello</bookstore>
  • code 03
    QDomElement ele=  root.firstChildElement();

    while(!ele.isNull())
    {
       qDebug() << "xx";
       ele = ele.nextSiblingElement();
    }

程序不会有任何输出
文本不是QDomELement子QDomELement

  • code 04
    QDomNode node=  root.firstChild();

    while(!node.isNull())
    {
       qDebug() << "xx";
       node = node.nextSibling();
    }

程序将会输出一个xx
文本QDomNode子QDomNode

了解了它们之间的联系之后,我们现在迫切的需要知道一个问题,既然文本和属性都不是子QDomELement,如何获取到文本和属性呢?

读写xml

遍历某QDomELement的 子QDomELement

  • 示例xml
<bookstore category="xml">
    <book category="CHILDREN">
      <title>Harry Potter</title>
      <author>J K. Rowling</author>
      <year>2005</year>
      <price>29.99</price>
    </book>
    <book category="WEB"&
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C/C++应用程序内存泄漏检查统计方.. 下一篇FFmpeg4.0笔记:封装ffmpeg的解封..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目