if(!doc.setContent(&file))出错的解决方法

本文最后更新于:2022年5月29日 上午

今天使用QT创建和读取XML文件,但是在使用过程中一直卡在if(!doc.setContent(&file))这句上,一直想不出哪里出问题。最终查找资料发现是下面这句代码出了问题

1
instruction=doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");

虽然这句话是按规定格式来写的,但是可能由于QT本身的问题一直没能正确的定义好xml文件的版本,因此在将xml文件递给doc解析时一直出错。最后是使用了QXmlStreamWriter来创建XML文件。下面直接看代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
QFile file("my.xml");

// 以只写方式打开,并清空以前的信息
if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
return;

// 采用QXmlStreamWriter 类来创建xml文件
QXmlStreamWriter writer(&file);

writer.setAutoFormatting(true); // 自动格式化
writer.writeStartDocument(); // 开始文档(XML 声明,)系统会自动定义xml的版本
writer.writeEndDocument(); // 结束文档
file.close(); // 关闭文件

// QXmlStreamWriter写xml会覆盖之前的内容,所以重新打开文件
if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
return;

QDomDocument doc;
QDomElement root = doc.createElement("书库");

doc.appendChild(root); // 添加根元素

// 添加第一个book元素及其子元素
QDomElement book = doc.createElement("图书");
QDomAttr id = doc.createAttribute("编号");
QDomElement title = doc.createElement("书名");
QDomElement author = doc.createElement("作者");
QDomText text;

id.setValue("1");
book.setAttributeNode(id);
text = doc.createTextNode("Qt");
title.appendChild(text);
text = doc.createTextNode("Qtcreater");
author.appendChild(text);
book.appendChild(title);
book.appendChild(author);
root.appendChild(book);

// 添加第二个book元素及其子元素
book = doc.createElement("图书");
id = doc.createAttribute("编号");
title = doc.createElement("书名");
author = doc.createElement("作者");
id.setValue("2");
book.setAttributeNode(id);
text = doc.createTextNode("Mybook");
title.appendChild(text);
text = doc.createTextNode("LKevin");
author.appendChild(text);
book.appendChild(title);
book.appendChild(author);
root.appendChild(book);
QTextStream out(&file);

doc.save(out, 4); // 将文档保存到文件,4为子元素缩进字符数
file.close();

这样,再读xml文件时就不会出错。

参考链接:

【1】if (!doc.setContent(&file))出错的解决方法


if(!doc.setContent(&file))出错的解决方法
https://kevinloongc.github.io/posts/cd25731.html
作者
Kevin Loongc
发布于
2020年9月26日
许可协议