用 Qt 中的 QDomDocument类 处理 XML 文件
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 文件的更多相关文章
- 用 Qt 中的 QDomDocument类 处理 XML 文件(上)
我们可以看到,如果所要读取的XML文件不是很大,采用DOM读取方法还是很便捷的,由于我用的也是DOM树读取的方法,所以,本文所介绍的也主要是基于DOM的方法读取. 根据常用的操作,我简单的把对XM ...
- 用 Qt 中的 QDomDocument类 处理 XML 文件(下)
QDomDocument doc; 1).创建根节点:QDomElement root = doc.documentElement("rootName " ); 2).创建元素 ...
- Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法:
Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法: ------------------------------------------------------------ ...
- Qt 中一些常用类中文说明
Qt 中一些常用类中文说明是本文讲述的内容,这篇文章主要是介绍Qt 当中经常使用的类,采取的是使用字母索引的方式,下面的类是被经常使用的. QDataStream 为QIODevice提供了一串的二进 ...
- 第11课 Qt中的字符串类
1. 历史遗留问题和解决方案 (1)历史遗留问题 ①C语言不支持真正意义上的字符串 ②C语言用字符数组和一组函数实现字符串操作 ③C语言不支持自定义类型,因此无法获得字符串类型 (2)解决方案 ①从C ...
- Android中通过代码获取arrays.xml文件中的数据
android工程res/valuse文件夹下的arrays.xml文件中用于放各种数组数据,比如字符串数组.整型数组等,数组中的数据可能是具体的值,也有可能是对资源数据的引用,下面针对这两种情况通过 ...
- 用java语言将数据库中的数据表转换为xml文件的通用程序(细化)
转自:https://www.cnblogs.com/wudage/p/7650685.html 总是在网络上copy别人的源代码,今天我也贴出自己今天写的源码,相信这个程序会对大家在平时的工作中需要 ...
- JAXB—Java类与XML文件之间转换
JAXB-Java类与XML文件之间转换 简介 JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生 ...
- C++ 中的模板类声明头文件和实现文件分离后,如何能实现正常编译?
C++ 中的模板类声明头文件和实现文件分离后,如何能实现正常编译? 这个feature叫做Export Template,即外名模板,它的作用在于使得模板代码可依照C/C++语言习惯,将模板声明和实现 ...
随机推荐
- ArcEngine10.x开发的许可问题
1. ArcEngine9.x迁至ArcEngine10.x 相信很多同学都知道,在ArcEngine9.x下正常编译的代码到ArcEngine10.x会报错:ArcGIS version not s ...
- STL - Map - 运行期自定义排序
RuntimeStringCmp.cpp #include <string> using namespace std; // function object to compare stri ...
- CheeseZH: Stanford University: Machine Learning Ex1:Linear Regression
(1) How to comput the Cost function in Univirate/Multivariate Linear Regression; (2) How to comput t ...
- MVC应用积累
1.Controller中的跳转 (1)直接Redirect后加(Controller/Action):Response.Redirect("/Home/Index"); (2)直 ...
- 设计模式——门面模式(Facade)
要想正确理解设计模式,首先必须明白它是为了解决什么问题而提出来的. 设计模式学习笔记 --Shulin 转载请注明出处:http://blog.csdn.net/zhshulin 1.概念 门面模式是 ...
- $ionicModal
Ionic中[弹出式窗口]有两种(如下图所示),$ionicModal和$ionicPopup; $ionicModal是完整的页面: $ionicPopup是(Dialog)对话框样式的,直接用Ja ...
- linux远程
apt-get install rdesktop $rdesktop -u administrator -p ****** -a 16 192.168.1.1 //都直接登陆了,
- JQuery URL的GET参数值获取方法
// jQuery url get parameters function [获取URL的GET参数值] // <code> // var GET = $.urlGet(); //获取UR ...
- RAM调优之日志分析
D/dalvikvm: <GC_Reason> <Amount_freed>, <Heap_stats>, <External_memory_stats> ...
- idea 配置多个tomcat
1.打开设置窗口 File-->Settings 2.启用tomcat 3.run-->edit configuration: 3.点击左上角+号-->找到Tomcat Serv ...