Qt的Dom来操作XML文档
Qt有三种方式读取并解析XML文档,同样有三种方式写XML,不过在下还是喜欢标准,所以使用DOM方式来解析和保存XML文档
首先是读取XML
1 QFile file(fileName);
2 if (!file.open(QFile::ReadOnly | QFile::Text)) {
3 return false;
4 }
5 QString errorStr;
6 int errorLine;
7 int errorColumn;
8
9 QDomDocument doc;
10 if (!doc.setContent(&file, false, &errorStr, &errorLine, &errorColumn)) {
11 return false;
12 }
13
14 QDomElement root = doc.documentElement();
15 if (root.tagName() != "root") {
16 return false;
17 }
18 parseElement(root);
19 file.close();
2 if (!file.open(QFile::ReadOnly | QFile::Text)) {
3 return false;
4 }
5 QString errorStr;
6 int errorLine;
7 int errorColumn;
8
9 QDomDocument doc;
10 if (!doc.setContent(&file, false, &errorStr, &errorLine, &errorColumn)) {
11 return false;
12 }
13
14 QDomElement root = doc.documentElement();
15 if (root.tagName() != "root") {
16 return false;
17 }
18 parseElement(root);
19 file.close();
获取跟节点,然后把这个根节点交给其他函数去解析就OK
然后是写xml
1 QFile file(fileName);
2 if (!file.open(QFile::ReadOnly | QFile::Text))
3 return false;
4 QString errorStr;
5 int errorLine;
6 int errorColumn;
7 QDomDocument doc;
8 if (!doc.setContent(&file, false, &errorStr, &errorLine, &errorColumn))
9 return false;
10
11 file.close();
12
13 QDomElement root = doc.documentElement();
14 if (root.tagName() != "root")
15 return false;
16
17 QDomElement element = doc.createElement("file");
18
19 QDomElement el_address = doc.createElement("address");
20 QDomText text_address = doc.createTextNode(address);
21 el_address.appendChild(text_address);
22
23 element.appendChild(el_address);
24
25 QDomElement el_path = doc.createElement("path");
26 QDomText text_path = doc.createTextNode(path);
27 el_path.appendChild(text_path);
28
29 element.appendChild(el_path);
30
31 root.appendChild(element);
32
33 QFile f(fileName);
34 if (!f.open(QFile::WriteOnly | QFile::Text))
35 return false;
36
37
38 QTextStream out(&f);
39 // element->save(out, 3);
40 root.save(out, 3);
41 // doc.save(out, 3);
42 f.close();
2 if (!file.open(QFile::ReadOnly | QFile::Text))
3 return false;
4 QString errorStr;
5 int errorLine;
6 int errorColumn;
7 QDomDocument doc;
8 if (!doc.setContent(&file, false, &errorStr, &errorLine, &errorColumn))
9 return false;
10
11 file.close();
12
13 QDomElement root = doc.documentElement();
14 if (root.tagName() != "root")
15 return false;
16
17 QDomElement element = doc.createElement("file");
18
19 QDomElement el_address = doc.createElement("address");
20 QDomText text_address = doc.createTextNode(address);
21 el_address.appendChild(text_address);
22
23 element.appendChild(el_address);
24
25 QDomElement el_path = doc.createElement("path");
26 QDomText text_path = doc.createTextNode(path);
27 el_path.appendChild(text_path);
28
29 element.appendChild(el_path);
30
31 root.appendChild(element);
32
33 QFile f(fileName);
34 if (!f.open(QFile::WriteOnly | QFile::Text))
35 return false;
36
37
38 QTextStream out(&f);
39 // element->save(out, 3);
40 root.save(out, 3);
41 // doc.save(out, 3);
42 f.close();
这里所有需要append的字节点只能由QDomDocument对象create,而不能直接new它,否则永远也看不到新添加的节点,另外,读取和写入的文件流必须创建两个,否则必然回将需要写入的文档继续在原来人当的后面,造成多个根节点。