1 #include "domxml.h"
2 #include <QFile>
3 #include <QDomElement> //元素
4 #include <QDomProcessingInstruction> //格式头
5 #include <QIODevice>
6 #include <QDomDocument> //文件
7 #include <QTextStream>
8 #include <QDebug>
9 #define qout qDebug()<<"["<<__TIME__<< __FUNCTION__ <<":"<< __LINE__<<"]"
10
11 const QString ALIAS="alias";
12 const QString SON_NODE="service";
13 const QString strHead("version=\'1.0\' encoding=\'UTF-8\'");
14 const QString XML="xml";
15
16 DomXml::DomXml()
17 {
18
19 }
20 void DomXml::createXml(const QString& filePath)
21 {
22 QFile file(filePath);
23 //文件已存在
24 bool isOk = file.open(QIODevice::WriteOnly);
25 if(!isOk)
26 {
27 return;
28 }
29 //xml文本对象
30 QDomDocument doc; 32 //xml头部实例
33 QDomProcessingInstruction ins;
34 //<?xml version='1.0' encoding='UTF-8'?>
35 ins = doc.createProcessingInstruction(XML,strHead);
36 //把实例xml头部加到doc对象中
37 doc.appendChild(ins);
38 //doc创建根节点元素
39 QDomElement root = doc.createElement("Nodes");
40 //把根节点元素加到doc中
41 doc.appendChild(root);
42 //file指针指向stream
43 QTextStream stream(&file);
44 stream.setCodec("UTF-8");
45 //将doc保存到文件中
46 doc.save(stream,4); //4个空格缩进
47 file.close();
48 }
49 QDomElement DomXml::createSonElement(const QString& str,const QMap<QString,QString>& map)
50 {
51 QDomDocument doc;
52 //第一子节点
53 QDomElement node = createElement(map);
54 QDomElement alias = doc.createElement(ALIAS);//第二子节点
55 QDomText text = doc.createTextNode(str);//节点文本
56 alias.appendChild(text);
57 node.appendChild(alias);
58 return node;
59 }
60 QDomAttr DomXml::createDomAttr(const QString& attr,const QString& value)
61 {
62 QDomDocument doc;
63 QDomAttr _attr = doc.createAttribute(attr);//属性
64 _attr.setNodeValue(value);//属性的值
65 return _attr;
66 }
67 QDomElement DomXml::createElement(const QMap<QString,QString>& map)
68 {
69 QDomDocument doc;
70 QDomElement element = doc.createElement(SON_NODE);//节点名
72 QMap<QString,QString>::const_iterator it=map.constBegin();
73 for(;it!=map.constEnd();it++)
74 {
75 //设属性节点
76 element.setAttributeNode(createDomAttr(it.key(),it.value()));
77 }
78 return element;
79 }
80 void DomXml::appendXml(const QString &filePath, const QString &text,const QMap<QString,QString>& map)
81 {
82 QFile file(filePath);
83 QDomDocument doc;
84 //不存在则创建
85 if(!file.exists())
86 {
87 createXml(filePath);
88 }
89 file.open(QIODevice::ReadOnly);
90 if(!doc.setContent(&file))
91 {
92 file.close();
93 return;
94 }
95 file.close();
96 QDomElement root = doc.documentElement();
97 //追加子节点
98 root.appendChild(createSonElement(text,map));
99 file.open(QIODevice::WriteOnly);
100 QTextStream stream(&file);
101 stream.setCodec("UTF-8");
102 doc.save(stream,4);
103 file.close();
104 }
105 QStringList DomXml::readXmlByAlias(const QString& filePath,const QString& alias)
106 {
107 QFile file(filePath);
108 QDomDocument doc;
109 QStringList list;
110 file.open(QIODevice::ReadOnly);
111 if(!doc.setContent(&file))
112 {
113 file.close();
114 return list;
115 }
116 file.close();
117 QDomElement root = doc.documentElement();
118 if(!root.hasChildNodes())
119 {
120 //没有子节点
121 return list;
122 }
123 QDomNodeList rootList = root.childNodes();
124 for(size_t i=0;i<rootList.size();i++)
125 {
126 QDomElement service = rootList.at(i).toElement();
127 if(!service.hasChildNodes())
128 {
129 continue;
130 }
131 if(service.childNodes().at(0).toElement().text()==alias)
132 {
133 list << service.attribute(conflg::ATTR_ip);//ip
134 list << service.attribute(conflg::ATTR_port);//port
135 list << service.attribute(conflg::ATTR_comm);//comm
136 return list;
137 }
138 }
140 }
141 QStringList DomXml::getAliasByreadXml(const QString& filePath)
142 {
143 QFile file(filePath);
144 QStringList list;
145 if(!file.exists())
146 {
147 return list;
148 }
149 QDomDocument doc;
150 file.open(QIODevice::ReadOnly);
151 if(!doc.setContent(&file))
152 {
153 file.close();
154 return list;
155 }
156 file.close();
157 QDomElement root = doc.documentElement();
158 if(!root.hasChildNodes())
159 {
160 //没有子节点
161 return list;
162 }
163 QDomNodeList rootList = root.childNodes();
164 for(size_t i=0;i<rootList.size();i++)
165 {
166 QDomElement service = rootList.at(i).toElement();
167 if(!service.hasChildNodes())
168 {
169 continue;
170 }
171 list << service.childNodes().at(0).toElement().text();//alias
172 }
173 return list;
174 }
175
176