2020-03-09

**

Qt中的XML应用

**
XML(可编程扩展语言)是普遍用于数据交换和数据存储的一种多用途,且具有结构性的文本文件格式。
对于比较流行的SVG(可标量化矢量图形)XML格式。QtSvg提供了可用于载入并呈现SVG图像类。
对于使用MathML(数学标记语言)XML格式绘制的文档,可以使用Qt Solution中的QtMmlWidget。
对于通用的XML数据处理,Qt提供了QtXml模块。

文档读取:
QtXml提供了三种截然不同的应用程序接口来读取XML文档:
①QXmlStreamReader 是一个用于读取格式良好的XML文档的快速解析器。
②DOM(文档对象模型)把XML文档转化为应用程序可以遍历的树形结构。
③SAX(XML简单应用程序编程接口)通过虚拟函数直接向应用程序报告“解析事件”。

QXmlStreamReader: 最快且最易于使用,同时它还提供了与其他Qt兼容的应用程序编程接口。
它很适合编写单通编译器;
DOM的主要优点是: 它能以任意的顺序遍历XML文档的树形表示,同时可以实现多通解析算法,
有一些应用程序甚至使用DOM树作为他们的基本数据结构。
SAX则因为一些历史原因而被沿用至今,使用QmlStreamReader通常会有更加简单高效的编码。

对于XML文件的写入,Qt也提供了三种可用的方法。
①使用QXmlStreamWriter;
②在内存中以DOM树的结构表示数据,并要求这个树形结构将自己写到文件中。
③手动生成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"?>

001

2010-05-10(13:53:24)

A meeting!

Script MT Bold

16

#00ffff

0

true

true

上面是创建一个便签节点,若要继续添加便签节点,则需要在已有节点后增加一个新节点,并重写入XML文件。

  1. 加载、查找便签时要读取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();//读取兄弟节点

}

}

  1. 删除便签时,要删除相应的XML节点,用到的主要函数为:root.removeChild(node); 但在删除某个节点后要重写整个文件。

以上对XML文件的重写操作是必须的,因此在文件的打开方式中要加上QIODevice::Truncate,表示覆盖重写。目前还没有找到可以直接修改文件的方法,但若文件很大的情况下,必须考虑相应的效率问题。

由于本项目在启动时需要将所有便签加载到内存,因此选用DOM方式比较合适,但如果处理的XML文件很大,而且不需要全部读到内存时,可以用SAX实现方式,它按阶段将文档读取到内存中,在碰到标签或者其它阶段的时候,可以调用开发者预先设计好的回调函数去处理,这样效率比DOM方式更高。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: QDomDocument.setContent()是Qt中的一个函数,用于将XML字符串解析为QDomDocument对象。它的作用是将XML字符串转换为QDomDocument对象,以便于对XML文档进行操作和处理。该函数的参数是一个QString类型的XML字符串,返回值为bool类型,表示解析是否成功。如果解析成功,则返回true,否则返回false。 ### 回答2: QDomDocument::setContent是Qt中的一个方法,用于将XML文档加载到QDomDocument对象中。 QDomDocument是Qt提供的用于操作XML文档的类,可以读取和修改XML文档的内容。setContent方法是其中的一个重要方法,用于将XML文档的内容加载到QDomDocument对象中进行解析和操作。 setContent方法接受一个XML文档的内容作为参数,可以是QString、QByteArray或QIODevice对象。它会根据传入的内容解析XML文档,并将解析后的结果保存在QDomDocument对象中,以便后续的处理。 在调用setContent方法后,可以通过QDomDocument提供的API来访问和修改XML文档的内容,例如获取节点、添加节点、修改节点的属性等等。 需要注意的是,setContent方法会根据解析的结果返回一个布尔值,表示解析是否成功。如果解析成功,返回true;如果解析失败,返回false。所以在使用setContent方法后,需要检查解析的结果,并根据返回值进行相应的处理。 总之,QDomDocument::setContent方法是Qt中用于加载XML文档的重要方法,通过它可以将XML文档的内容解析并保存在QDomDocument对象中,方便后续对XML文档进行访问和修改。 ### 回答3: QDomDocument.setContent() 是一个用于将 XML 数据加载到 QDomDocument 对象的方法。它接受一个参数,即要加载的 XML 数据。 使用 QDomDocument.setContent() 方法时,可以将一个包含 XML 数据的字符串传递给它。方法会为该对象创建一个文档树,根据提供的 XML 数据构建该树。 以下是使用 QDomDocument.setContent() 方法的示例代码: ```cpp QString xmlData = "<root>" "<element1>Value 1</element1>" "<element2>Value 2</element2>" "</root>"; QDomDocument doc; if(doc.setContent(xmlData)) { // XML 数据加载成功 // 遍历文档树、提取数据等操作 } else { // XML 数据加载失败 // 处理错误或异常情况 } ``` 在上述示例中,我们创建了一个包含 XML 数据的字符串 xmlData,并将其传递给 QDomDocument.setContent() 方法。该方法会将该字符串解析为一个 QDomDocument 对象中的文档树。 如果加载成功,可以对 QDomDocument 对象进行遍历操作,提取所需的数据。如果加载失败,可能是由于 XML 数据格式错误或其他原因,可以在 else 语句块中处理相应的错误或异常情况。 总结来说,QDomDocument.setContent() 方法用于将 XML 数据加载到 QDomDocument 对象中,使我们能够方便地对 XML 数据进行处理和操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值