一、根据QDomNode::TypeName名字找到第一个符合的node :

以下两个函数可以直接查询XML节点(QDomNode)是否存在名字tagName的子节点,不需要遍历子节点。firstChildElement  或者 namedItem.

    /* Shortcut to avoid dealing with QDomNodeList* all the time. */QDomNode namedItem(const QString& name) const;
QDomElement firstChildElement(const QString &tagName = QString()) const;

与 firstChildElement 类似的(即可根据tagNeme查找子节点的函数)还有以下

    QDomElement firstChildElement(const QString &tagName = QString()) const;QDomElement lastChildElement(const QString &tagName = QString()) const;QDomElement previousSiblingElement(const QString &tagName = QString()) const;QDomElement nextSiblingElement(const QString &taName = QString()) const;

上面这四个函数可以用来遍历子节点,与之类似的还有:firstChild(), nextSibling(), lastChild(), previousSibling(), parentNode().

for(QDomElement sElem = elem.firstChildElement(); !sElem.isNull(); sElem = sElem.nextSiblingElement())
for(QDomElement sElem = elem.firstChildElement("要查找的tagName"); !sElem.isNull(); sElem = sElem.nextSiblingElement("要查找的tagName"))

他们的不同点是:firstChildElemment()查找的是必须有 nodeName有节点名字的节点,返回的是 element;函数中的参数就是nodename,可写可不写,有这个参数,就表明遍历的是 tagName 为某固定字符串的子节点;

firstChild()查找所有子节点的第一个(不论有无nodeName),返回的是 node;

综上,在for 循环中遍历子节点,用firstChildElemment()、nestSiblingElemment()  和 firstChild()、nestSibling() 的遍历次数是不一样的,因为没有节点名的节点没有被firstChildElemment() 查找;

二、根节点解析:

    QDomElement root = dom->documentElement();QDomNodeList nodelist = root.childNodes();

三、解析节点中间<..> XXXXX </..>的文本 XXXXX

例如 <cor:Uri xsi:nil="false">mmarch://bin/DBE406EB-824C-48B9-AE93-9C3C7BECCB5A.bin</cor:Uri> ,使用

QString QDomElement::text() const;

四、保存element

解析XML文件的时候,常遇到的一个问题就是要修改element的值然后保存

QDomElement el = node_2.toElement();    //tag为key的节点
QDomNode oldnode = el.firstChild();     //标签之间的内容作为节点的子节点出现,得到原来的子节点
el.firstChild().setNodeValue(str);      //用提供的value值来设置子节点的内容
QDomNode newnode = el.firstChild();     //值修改过后的子节点
el.replaceChild(newnode,oldnode);       //调用节点的replaceChild方法实现修改功能

QDom 保存到文本流

xmldoc.save(out, 4, QDomNode::EncodingFromDocument);
原型:
void QDomNode::save(QTextStream &stream, int indent, EncodingPolicy encodingPolicy = QDomNode::EncodingFromDocument) const

五、遍历节点的属性

attribute() 函数,返回QDomNamedNodeMap 类型变量

        QDomNamedNodeMap attrs = custElem.attributes();int size = attrs.size();for(int i=0; i< size; ++i){QDomNode node = attrs.item(i);qDebug() << " node Name : Value :" << node.nodeName() << node.nodeValue();}

六、 拷贝节点,避免引用

QDomNode cloneNode(bool deep = true) const;

七、 节点 <node/> 不为空 Null

bool QDomNode::isNull() const

节点 <node/> 调用 isNull,返回false;这个函数应该是判断有无此节点.

八、获取 XML 子节点:直系子节点 / 子孙~~节点

//QDomNode ::
QDomNodeList childNodes() const;
//Returns a list of all direct child nodes. 直接的子节点
//QDomElement 和 QDocument
QDomNodeList elementsByTagName(const QString& tagname) const;
//深层递归,获取所有子节点

Qt解析XML相关(QDom方式)相关推荐

  1. Java解析XML文件的方式

    在项目里,我们往往会把一些配置信息放到xml文件里,或者各部门间会通过xml文件来交换业务数据,所以有时候我们会遇到"解析xml文件"的需求.一般来讲,有基于DOM树和SAX的两种 ...

  2. QT解析XML的三种方式

    1-QT QXmlStreamReader用法小结 解析常用到的函数含义: 1--导入一个xml文件或字符串的方式 //方式一QXmlStreamReader reader(sXMLContent); ...

  3. Qt解析XML及QTableWidget用法示例

    #include "widget.h" #include "ui_widget.h" #include <QFile> #include <Q ...

  4. 解析XML三种方式(PULL、SAX、DOM)

    本篇博客重点介绍Android中三种解析XML的方式,包括PULL.SAX.DOM,当然不止这些,还可以用第三方的jar包提供的解析,只是这三种在Android中比较常用吧.再顺便介绍一下Androi ...

  5. Android解析XML三种方式(PULL、SAX、DOM)

    本篇博客重点介绍Android中三种解析XML的方式,包括PULL.SAX.DOM,当然不止这些,还可以用第三方的jar包提供的解析,只是这三种在Android中比较常用吧.再顺便介绍一下Androi ...

  6. python 解析xml 文件: SAX方式

    环境 python:3.4.4 准备xml文件 首先新建一个xml文件,countries.xml.内容是在python官网上看到的. <?xml version="1.0" ...

  7. PYTHON解析XML的多种方式效率对比实测

    在最初学习PYTHON的时候,只知道有DOM和SAX两种解析方法,但是其效率都不够理想,由于需要处理的文件数量太大,这两种方式耗时太高无法接受. 在网络搜索后发现,目前应用比较广泛,且效率相对较高的E ...

  8. 另一种ABAP解析XML file的方式

    Created by Jerry Wang on Jun 20, 2014 xml 源文件source code 如下: <?xml version="1.0"?> & ...

  9. adroid解析XML三种方式

    废话少说,直接上代码: Pull 解析     跳至 [1] [2] [3] [全屏预览] ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2 ...

最新文章

  1. 被字节跳动T4级大佬鄙视了:让你10倍提升认知效率,就这3个方法!
  2. java图形用户界面添加背景颜色不成功的解决方案
  3. docker配置国内镜像源
  4. boost::math::daubechies_wavelet用法的测试程序
  5. 机器学习-特征抽取02
  6. php 循环多条件,怎么循环带条件的数组
  7. python蓝牙编程_蓝牙编程经典程序!
  8. 嵌入式成长轨迹37 【Zigbee项目】【CC2430基础实验】【自动闪烁】
  9. js使浏览器窗口最大化(适用于IE的方法)
  10. VGG和GoogLeNet inception
  11. CANE:上下文相关动态图网络表示
  12. 有未经处理的异常(在 xx.exe 中): 堆栈 Cookie 检测代码检测到基于堆栈的缓冲区溢出。
  13. 转载:如果你到了20岁,还没到 25岁 作者:李开复
  14. HCIE Secuirty 防火墙内容安全组合 备考笔记(幕布)
  15. 关于web前端性能优化总结
  16. 自己实现的水版MPI_Bcast(使用binomial tree,跟mpich2实现思路一样)
  17. 如何做好一次视频号直播
  18. oracle修改分区表的默认空间,Oracle数据库学习_Oracle分区表的分区占用空间为什么是8M?如何修改分区的初始空间?...
  19. 关于在IE8浏览器的环境下页面一直刷新的问题
  20. python pyside简单布局_PySide2/PyQt5的4种基础布局管理

热门文章

  1. 设置Windows桌面壁纸
  2. outlook修改服务器端口号,Outlook 设置教程
  3. 第六十九章 Caché 函数大全 $WCHAR 函数
  4. processing作业:画有五角星绕圈的国旗(此例:塔吉克斯坦共和国国旗)
  5. 基于Python和Cpp的汉英词语自动对齐系统 课程报告+演示视频+项目源码
  6. 计算机网络介质图片,存储介质是什么
  7. 【随笔记】我的 CSDN 两周年创作纪念日
  8. 穷人如何使用测试驱动开发进行重构
  9. [激光原理与应用-17]:《激光原理与技术》-3- 激光的产生技术 与原理 - 微观粒子、能级、电子、光子、受激辐射
  10. 【VOLTE案例解析】南京移动拨打10086回落到2G,拨打其他电话正常使用VOLTE