Qt学习之XML读写操作小结
西安电子科技大学
在“QQ便签”项目组中我负责有关后台XML操作的实现部分,现在对在项目中用到的XML的相关操作进行简单的小结。
我们知道对XML的操作有两种方法,即DOM方式和SAX方式。二者主要区别是:DOM实现方式操作非常简单,但不适合处理过大文件;而SAX实现方式是能处理很大的XML文件,但是需要开发者写一些复杂的代码。Qt提供了对应于这两种用于读取、操作和编写XML的实现类,分别是QDomDocument类和QXmlStreamReader类,由于在项目中涉及的文件不大,因此我们选用QDomDocument类来处理。
项目中涉及便签的增删改查,对应于XML文件中相应标记的读、写和修改,下面分别介绍:
1. 创建节点,将其写入XML文件,主要操作包括:
1).创建根节点:QDomElement root = doc.documentElement("rootName " );
2).创建元素节点:QDomElement element = doc.createElement("nodeName");
3).添加元素节点到根节点:root. appendChild(element);
4).创建元素文本:QDomText nodeText=doc.createTextNode("text");
5).添加元素文本到元素节点:element. appendChild(nodeText);
在本项目中,假设便签的属性有序号、名字、内容、字体、字号、颜色、粗细、斜体、下划线这几项,则在文件中添加一个便签节点的操作如下:
QDomDocument doc;
instruction = doc.createProcessingInstruction("xml","version=/"1.0/" encoding=/"UTF-8/"");
doc.appendChild(instruction);
QDomElement root = doc.createElement("Notes");
doc.appendChild(root);
QDomElement note = doc.createElement("note");
root.appendChild(note);
QDomElement no = doc.createElement("no");
note.appendChild(no);
...
...
QDomText no_text = doc.createTextNode("001");
...
...
则得到一个便签节点,将其保存到test.xml文件中,代码如下:
QFile file("test.xml");
if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate |QIODevice::Text))
return ;
QTextStream out(&file);
out.setCodec("UTF-8");
doc.save(out,4,QDomNode::EncodingFromTextStream);
file.close();
则test.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>
<fontSize>16</fontSize>
<color> #00ffff</color>
<weight>0</weight>
<fontItalic>true</fontItalic>
<fontUnderline>true</fontUnderline>
</note>
</Notes>
上面是创建一个便签节点,若要继续添加便签节点,则需要在已有节点后增加一个新节点,并重写入XML文件。
2. 加载、查找便签时要读取XML文档中的节点信息,DOM实现方式是将整个文档当作一个对象来装入内存进行处理,然后开发者可以访问这个对象中的每一个节点,每一个节点对应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();
以下是项目中读取便签属性的函数实现代码:
void MainWindow::parseAttr(const QDomElement &element)
{
QString no,name,content,font,fontSize,color;
QDomNode node = element.firstChild();
while (!node.isNull()) {
if (node.toElement().tagName() == "note") {//匹配note节点
parseAttr(node.toElement());
} else if (node.toElement().tagName() == "no") {//匹配属性no
QDomNode childNode = node.firstChild();
if (childNode.nodeType() == QDomNode::TextNode) {
no = childNode.toText().data();
}
}
else if (node.toElement().tagName() == "name") //匹配属性name
...
...
node = node.nextSibling();//读取兄弟节点
}
}
3. 删除便签时,要删除相应的XML节点,用到的主要函数为:root.removeChild(node); 但在删除某个节点后要重写整个文件。
以上对XML文件的重写操作是必须的,因此在文件的打开方式中要加上QIODevice::Truncate,表示覆盖重写。目前还没有找到可以直接修改文件的方法,但若文件很大的情况下,必须考虑相应的效率问题。
由于本项目在启动时需要将所有便签加载到内存,因此选用DOM方式比较合适,但如果处理的XML文件很大,而且不需要全部读到内存时,可以用SAX实现方式,它按阶段将文档读取到内存中,在碰到标签或者其它阶段的时候,可以调用开发者预先设计好的回调函数去处理,这样效率比DOM方式更高。
相关推荐
基于QT实现XML文件读写,解析操作
QT中对XML进行读写操作,一共两个程序,下载后直接qmake&nmake就可以了~
Qt读写Xml文件,QTreeWidget显示Xml和导出Xml文件
基于QT的QDomDocument封装的XML操作,显示类。使在QT中操作XML比较方便,快捷。如果觉得那里封装的不好,欢迎提出宝贵意见,建议,我再改正。
资源里面主要是实现QT 对xml文件的读写,如何读取文件,写入文件,怎么获取节点,添加节点。里面有相应的说明。
Qt 实现界面操作xml的读取管理信息的功能,里面有一些撤销保存,都是在内存中处理的、可以实现只保存修改的、删除的等
Qt读写Xml文件;QTreeWidget加载显示Xml文件内容;QTreeWidget项导出保存为Xml;QTreeWidget项实现可拖动
【Qt】 XML流读写XML.rar
qt读写xml,导入可直接使用,有3个函数,分别是创建、读xml、写xml,都是静态的。写文件时,如果xml中有内容会被清除重新写入。
Qt读写Xml文件到tableWidget,实现节点数据的读取及写入xml文件
最近因业务需要,需要更改XML文件中某一结点的值,于是搜索相关资料,但是网上搜出来资料的没有详细解释,好不容易才搞明白,因此,将代码上传,以供各位少走弯路。本程序支持1.创建一个XML文件。2.读取一个XML文件...
1、Demo运行环境VS2019+Qt5.15.2 2、Demo运行结果请看博客:https://mp.csdn.net/mp_blog/creation/success/125038202
亲测,构建时使用源文件目录,可以直接运行
对xml文件的读写,下载既可以用的完整代码。希望解决大家烦恼
QT读写XML与Sqlite; 包括了QT读写XML的方法和Sqlite数据库的方法,项目完整案例,可以直接使用;
qt 实现xml的完整操作 遍历属性等 非常实用 项目中多次用
1.VS中没有.pro文件,怎么添加XML模块的使用。 2.XML中含有中文字符时,在写入XML文件时,如何避免中文乱码。 博客链接:https://blog.csdn.net/qq_28662831/article/details/90264682
QT写的XML文档操作源代码,是学习XML操作的很好资料,成功运行,非常不错
QT5.9.1 + MSVC2015 一个简单解析XML文件的例子,很简单;
(2) <ip>211.87.235.136 对于第一种情况,采用如下方法: QDomNodeList list1 = doc.elementsByTagName(tr("switch ")) //红色的为标签名 for(int i = 0; i ();... QDomElement e1 = list1.at(i).toElement();...