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