创建xml文件

本文介绍了一个基于Qt的DOM实现,用于创建、追加和读取XML文件的方法。主要内容包括:创建XML文件及其头部信息,添加带有属性的元素节点,以及根据别名读取特定节点的数据。
  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  

 

转载于:https://www.cnblogs.com/fushou/p/7291879.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值