XML(可扩展标记语言)文件本身不能对自己“做出”任何操作。它们是存储数据的一种简单方式,而存储的数据可以被其它软件轻松读取。很多程序都会使用可扩展标记语言(XML)来存储数据。XML可用来存储数据、携带数据和交换数据,不是为了显示数据而设计的。
配置文件在程序中的应用还是很常见的,如我们需要启动一个Socket 的客户端去连接远程的Server,这时需要设置服务器的Ip和Port。当我们本次设置完成后,下次再使用的时候希望程序“记录”这个Ip和Port,我们直接连接即可,而不是要求用户再输入一次。面对这种需要“记录”的功能,我们可以使用配置文件。
对于数量不多的配置信息,我们可以使用QSettings进行记录,而对于一些复杂而且数量较多的配置信息,我们则可以使用配置文件。如Xml配置文件、Json配置文件等。
程序平台:ubuntu、 Qt 5.5.1
程序配置文件的主体功能:构造一个配置信息的结构体ConfigInfo,用于存储需要记录的信息,在点击Save按钮时写入配置文件,在构造函数中读取配置信息。当我们下次再运行程序时,读取配置文件后,将我们上次保存的信息显示到UI界面上。该Demo是用来记录Ip和Port的。
①生成Xml文件
void Widget::writeXmlConfig(const QString &fileName, ConfigInfo &configInfo)
{
QDomDocument doc;
QDomProcessingInstructioninstruction= doc.createProcessingInstruction("xml","version="1.0"encoding="UTF-8"");
doc.appendChild(instruction);
QDomElement root = doc.createElement("Config");//创建根节点
doc.appendChild(root); //添加根节点
//ip
QDomElement strIP = doc.createElement("Ip");
root.appendChild(strIP); //添加元素节点到根节点
QDomText strIpText = doc.createTextNode(configInfo.ip);
strIP.appendChild(strIpText); //添加元素文本到元素节点
//port
QDomElement strPort = doc.createElement("Port");
root.appendChild(strPort); //添加元素节点到根节点
QDomText strPortText = doc.createTextNode(QString::number(configInfo.port));
strPort.appendChild(strPortText); //添加元素文本到元素节点
saveXmlConfig(fileName, doc);
}
②写入完成后保存到文件中:
void Widget::saveXmlConfig(const QString &fileName, QDomDocument &doc)
{
QDir m_dir("./testXmlConfig");
if(!m_dir.exists())
{
system("mkdir ./testXmlConfig");
}
QFile file(m_dir.absolutePath() + "/" + fileName);
if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text))
{
return;
}
QTextStream out(&file);
out.setCodec("UTF-8");
doc.save(out, 4, QDomNode::EncodingFromTextStream);
file.close();
}
①读取Xml文件
void Widget::readXmlConfig(const QString &fileName, ConfigInfo &configInfo)
{
QFile file(fileName);
if(file.open(QIODevice::ReadOnly))
{
QDomDocument doc("testConfig");
if(doc.setContent(&file))
{
QDomElement root = doc.documentElement();
listDom(root,configInfo);
}
file.close();
}
}
②遍历存储的节点
void Widget::listDom(QDomElement &docElem,
ConfigInfo &configInfo)
{
QDomNode node = docElem.firstChild();
if(node.toElement().isNull())
{
return;
}
while(!node.isNull())
{
QDomElement element = node.toElement();
if(element.tagName() == "Ip")
{
configInfo.ip = element.text();
qDebug() << "test ip" << configInfo.ip;
}
if(element.tagName() == "Port")
{
configInfo.port = element.text().toInt();
qDebug() << "test port" << configInfo.port;
}
node = node.nextSibling();
}
}
以后有机会可以和大家介绍下读取Xml文件后将他们显示到Qt的TreeWidget上。
公众号 Pou光明
公众号后台留言可获取完整工程