XML,全称为 “可扩展标记语言”(extensible markup language).是一种非常方便的数据交换与数据存储的工具。

我们在取得一个XML格式的文件后,需要作句法分析去提取发布方提供的信息。而Qt为XML提供了很好的支持,包括DOM方式的实现和SAX方式的实现。

二者主要区别是:

DOM (Document Object Model) 实现方式操作非常简单,但不适合处理过大文件;而SAX实现方式是能处理很大的XML文件,但是需要开发者写一些复杂的代码。Qt提供了对应于这两种用于 读取、操作和编写XML的实现类,分别是QDomDocument类和QXmlStreamReader类,这里我们选QDomDocument类来处理XML文件。

首先是读取XML

主要操作包括:

1).读取根节点:QDomElement  root = doc.documentElement();

2).读取第一个子节点:QDomNode  node = root.firstChild();

3).读取下一个子节点:node = node.nextSibling();

4).匹配结点标记:node.toElement().tagName() == "note"

5).读取节点文本:no = childNode.toText().data();

QFile file(fileName);
     if(!file.open(QFile::ReadOnly | QFile::Text)) {
         return false;
      }
     QString errorStr;
     int errorLine;
     int errorColumn;
 
      QDomDocument doc;
     if(!doc.setContent(&file, false, &errorStr, &errorLine, &errorColumn))

// setContent 是将指定的内容指定给QDomDocument 解析,第一参数可以是QByteArray或者是文件名等。
         return false;
      }
 
      file.close();

 

可以通过 doc.childNodes() 获得doc的所有的 子节点 列表QDomNodeList。比如

QDomNodeList list=doc.childNodes();

for(int i=0;i<list.count();i++)

{

QDomNode  node=list.at(i);

// qDebug()<<”node name is “<<node.nodeName();

// qDebug()<<”node type is “<<node.nodeType();

}

通过上面的方法你就能知道每个节点的 名字和类型 了,节点名字就是 标记 的名字。打印出来对照着 xml文件看就很容易明白了。QDomNode类是一个父类, QDomDocument是QDomNode的一个子类,鉴于大部分 QDomNode的类型 都是QDomDocument.那么你可以使用toDocument()函数将QDomNode类型转换成QDomDocument.

QString text=node.toElement().text();

上面的语句可以将一个节点里的 文本 取出也就是 标记内的文本 部分。使用该函数获得的编码就已经是unicode格式了,不需要再做转换。

 

然后是写入XML

创建节点,将其写入XML文件,主要操作包括:

1).创建根节点:QDomElement  root = doc.documentElement("rootName " );

2).创建元素节点:QDomElement  element = doc.createElement_x_x_x("nodeName");

3).添加 元素节点到 根节点:root. a(element);

4).创建文本节点:QDomText  nodeText=doc.createTextNode("text");

5).添加 文本节点到 元素节点:element. a(nodeText);

XML文件的内容:

<?xml version="1.0" encoding="UTF-8"?>

<Notes>

<note>

<no>001</no>

<name>2010-05-10(13:53:24)</name>

<content>A meeting!</content>

<font>Script MT Bold</font>

</note>

</Notes>

QFile  file(fileName);
      if(!file.open(QFile::ReadOnly | QFile::Text))
         returnfalse;
      QString errorStr;
      interrorLine;
      interrorColumn;
      QDomDocument doc;
      if(!doc.setContent(&file, false, &errorStr, &errorLine, &errorColumn))
         returnfalse;
 
      file.close();
 
      QDomElement root = doc.documentElement();
      if(root.tagName() != "root")
         returnfalse;
 
      QDomElement element =   doc.createElement_x_x_x("file");

QDomElement el_address = doc.createElement_x_x_x("address");
      QDomText text_address = doc.createTextNode("text");

el_address.a (text_address);
      element.a (el_address);
 
      QDomElement el_path = doc.createElement_x_x_x_x("path");
      QDomText text_path = doc.createTextNode("text");

el_path.a (text_path);
      element.a (el_path);
 
      root.a (element);
 
      QFile f(fileName);
     if(!f.open(QFile::WriteOnly | QFile::Text))
         return false;
 
      QTextStream out(&f);

out.setCodec("UTF-8"); //中文编码

//    doc.save(out,4,QDomNode::EncodingFromTextStream);

doc.save(out, 3);
      f.close();

这里所有需要append的字节点只能由QDomDocument对象create,而不能直接new它,否则永远也看不到新添加的节点,另外,读取和写入的文件流必须创建两个,否则会将需要写入的文档继续在原来文档的后面,造成多个根节点。

用 Qt 中的 QDomDocument类 处理 XML 文件的更多相关文章

  1. 用 Qt 中的 QDomDocument类 处理 XML 文件(上)

      我们可以看到,如果所要读取的XML文件不是很大,采用DOM读取方法还是很便捷的,由于我用的也是DOM树读取的方法,所以,本文所介绍的也主要是基于DOM的方法读取. 根据常用的操作,我简单的把对XM ...

  2. 用 Qt 中的 QDomDocument类 处理 XML 文件(下)

      QDomDocument doc; 1).创建根节点:QDomElement root = doc.documentElement("rootName " ); 2).创建元素 ...

  3. Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法:

    Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法: ------------------------------------------------------------ ...

  4. Qt 中一些常用类中文说明

    Qt 中一些常用类中文说明是本文讲述的内容,这篇文章主要是介绍Qt 当中经常使用的类,采取的是使用字母索引的方式,下面的类是被经常使用的. QDataStream 为QIODevice提供了一串的二进 ...

  5. 第11课 Qt中的字符串类

    1. 历史遗留问题和解决方案 (1)历史遗留问题 ①C语言不支持真正意义上的字符串 ②C语言用字符数组和一组函数实现字符串操作 ③C语言不支持自定义类型,因此无法获得字符串类型 (2)解决方案 ①从C ...

  6. Android中通过代码获取arrays.xml文件中的数据

    android工程res/valuse文件夹下的arrays.xml文件中用于放各种数组数据,比如字符串数组.整型数组等,数组中的数据可能是具体的值,也有可能是对资源数据的引用,下面针对这两种情况通过 ...

  7. 用java语言将数据库中的数据表转换为xml文件的通用程序(细化)

    转自:https://www.cnblogs.com/wudage/p/7650685.html 总是在网络上copy别人的源代码,今天我也贴出自己今天写的源码,相信这个程序会对大家在平时的工作中需要 ...

  8. JAXB—Java类与XML文件之间转换

    JAXB-Java类与XML文件之间转换 简介         JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生 ...

  9. C++ 中的模板类声明头文件和实现文件分离后,如何能实现正常编译?

    C++ 中的模板类声明头文件和实现文件分离后,如何能实现正常编译? 这个feature叫做Export Template,即外名模板,它的作用在于使得模板代码可依照C/C++语言习惯,将模板声明和实现 ...

随机推荐

  1. #lspci | grep Eth

    该命令作用:将lspci的输出当做输入,从中找出包含Eth的行.在我的Fedora机器上运行结果为 [root@localhost etc]# lspci | grep Eth00:04.0 Ethe ...

  2. 在服务器端判断request来自Ajax请求(异步)还是传统请求(同步)

    两种请求在请求的Header不同,Ajax 异步请求比传统的同步请求多了一个头参数 1. 传统同步请求参数 accept text/html,application/xhtml+xml,applica ...

  3. html5开放资料

    http://www.cnblogs.com/tim-li/archive/2012/08/06/2580252.html KineticJS教程(12) 摘要: KineticJS教程(12) 作者 ...

  4. ubuntu 下安装配置open-iscsi并自动挂载

    1.安装open-iscsi apt-get install open-iscsi 2.发现iscsi-target(ISCSI服务器IP:192.168.1.104) iscsiadm -m dis ...

  5. js时间转换,能够把时间转换成yyyymmdd格式或yyyymm格式

    //type为1则转换成yyyymmdd格式,type为2则转换成yyyymm格式 function formatTime(time,type){ var temp_time=new Number(t ...

  6. 普通spring jsp+mybatis项目修改为springboot + jsp +mybatis项目

    概述 由于公司决定使用spring cloud,但是公司积累了大量的普通的jsp项目,老的项目直接全部修改为springboot成本过高,周期比较长,而且公司业务正在快速拓展,所以需要把之前的老项目修 ...

  7. HighCharts终极版本

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  8. POJ 3468 A Simple Problem with Integers 【树状数组】

    题目链接:id=3468">http://poj.org/problem?id=3468 题目大意:给出一组数组v[i],有两种操作,一种给出两个数a,b.要求输出v[a]到v[b]之 ...

  9. UpdatePanel的用法详解

    摘自:http://www.cnblogs.com/shangxia/articles/2281782.html 一.UpdatePanel的结构 <asp:ScriptManager ID=& ...

  10. 阿里云ECS服务器Linux环境下配置php服务器(一)--基础配置篇

    开始安装软件了,我们需要安装的软件有apache,php和MySQL. ps:如果你购买的是北京的服务器,有个安全组需要设置,我全部用的默认设置,暂时还没发现会有什么影响. 首先关闭SELINUX(S ...