#include "domxml.h"
#include <QFile>
#include <QDomElement> //元素
#include <QDomProcessingInstruction> //格式头
#include <QIODevice>
#include <QDomDocument> //文件
#include <QTextStream>
#include <QDebug>
#define qout qDebug()<<"["<<__TIME__<< __FUNCTION__ <<":"<< __LINE__<<"]"
const QString ALIAS="alias";
const QString SON_NODE="service";
const QString strHead("version=\‘1.0\‘ encoding=\‘UTF-8\‘");
const QString XML="xml";
DomXml::DomXml()
{
}
void DomXml::createXml(const QString& filePath)
{
QFile file(filePath);
//文件已存在
bool isOk = file.open(QIODevice::WriteOnly);
if(!isOk)
{
return;
}
//xml文本对象
QDomDocument doc;
QDomDocument doc;
//xml头部实例
QDomProcessingInstruction ins;
//<?xml version=‘1.0‘ encoding=‘UTF-8‘?>
ins = doc.createProcessingInstruction(XML,strHead);
//把实例xml头部加到doc对象中
doc.appendChild(ins);
//doc创建根节点元素
QDomElement root = doc.createElement("Nodes");
//把根节点元素加到doc中
doc.appendChild(root);
//file指针指向stream
QTextStream stream(&file);
stream.setCodec("UTF-8");
//将doc保存到文件中
doc.save(stream,4); //4个空格缩进
file.close();
}
QDomElement DomXml::createSonElement(const QString& str,const QMap<QString,QString>& map)
{
QDomDocument doc;
//第一子节点
QDomElement node = createElement(map);
QDomElement alias = doc.createElement(ALIAS);//第二子节点
QDomText text = doc.createTextNode(str);//节点文本
alias.appendChild(text);
node.appendChild(alias);
return node;
}
QDomAttr DomXml::createDomAttr(const QString& attr,const QString& value)
{
QDomDocument doc;
QDomAttr _attr = doc.createAttribute(attr);//属性
_attr.setNodeValue(value);//属性的值
return _attr;
}
QDomElement DomXml::createElement(const QMap<QString,QString>& map)
{
QDomDocument doc;
QDomElement element = doc.createElement(SON_NODE);//节点名
QMap<QString,QString>::const_iterator it=map.constBegin();
for(;it!=map.constEnd();it++)
{
//设属性节点
element.setAttributeNode(createDomAttr(it.key(),it.value()));
}
return element;
}
void DomXml::appendXml(const QString &filePath, const QString &text,const QMap<QString,QString>& map)
{
QFile file(filePath);
QDomDocument doc;
//不存在则创建
if(!file.exists())
{
createXml(filePath);
}
file.open(QIODevice::ReadOnly);
if(!doc.setContent(&file))
{
file.close();
return;
}
file.close();
QDomElement root = doc.documentElement();
//追加子节点
root.appendChild(createSonElement(text,map));
file.open(QIODevice::WriteOnly);
QTextStream stream(&file);
stream.setCodec("UTF-8");
doc.save(stream,4);
file.close();
}
QStringList DomXml::readXmlByAlias(const QString& filePath,const QString& alias)
{
QFile file(filePath);
QDomDocument doc;
QStringList list;
file.open(QIODevice::ReadOnly);
if(!doc.setContent(&file))
{
file.close();
return list;
}
file.close();
QDomElement root = doc.documentElement();
if(!root.hasChildNodes())
{
//没有子节点
return list;
}
QDomNodeList rootList = root.childNodes();
for(size_t i=0;i<rootList.size();i++)
{
QDomElement service = rootList.at(i).toElement();
if(!service.hasChildNodes())
{
continue;
}
if(service.childNodes().at(0).toElement().text()==alias)
{
list << service.attribute(conflg::ATTR_ip);//ip
list << service.attribute(conflg::ATTR_port);//port
list << service.attribute(conflg::ATTR_comm);//comm
return list;
}
}
}
QStringList DomXml::getAliasByreadXml(const QString& filePath)
{
QFile file(filePath);
QStringList list;
if(!file.exists())
{
return list;
}
QDomDocument doc;
file.open(QIODevice::ReadOnly);
if(!doc.setContent(&file))
{
file.close();
return list;
}
file.close();
QDomElement root = doc.documentElement();
if(!root.hasChildNodes())
{
//没有子节点
return list;
}
QDomNodeList rootList = root.childNodes();
for(size_t i=0;i<rootList.size();i++)
{
QDomElement service = rootList.at(i).toElement();
if(!service.hasChildNodes())
{
continue;
}
list << service.childNodes().at(0).toElement().text();//alias
}
return list;
}