Qt—xml文件增删改查基本操作—函数的封装 v1.0

本文介绍了一个基于Qt的XML文件操作封装方法,包括创建、增删改查等基本功能。通过函数封装,简化了XML文件的处理流程,适用于需要频繁操作XML文件的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Qt—xml文件增删改查基本操作—函数的封装 v1.0


前提:使用Qt的xml库
参考: https://blog.youkuaiyun.com/hpu11/article/details/80227093
说明:这是实现的第一个版本没有在实际项中使用,好不好用,还在考察
思路:搭建一个空xml格式文件(只有根节点,0个子节点的xml文件),在对其增删改节点

Xml文件的创建

  • 说明:创建一个只有根节点的xml文件,运行思路为创建空xml文件后,在添加节点
  • 函数名
bool creatXml(const QString& path, const QString& verEnc, const QString& rootname);
  • 参数说明
    const QString& path 【xml路径】,
    const QString& verEnc【版本和编码格式】,
    const QString& rootname【根节点名字】
  • 调用举例
if (creatXml("text2.xml", "version = \"1.0\"encoding=\"UTF-8\"", "root")) qDebug() << "creat is ok";
  • 举例说明:在当前目录创建text2.xml文件 版本号为1.0,编码格式UTF-8,根节点名字为root,如果成功打印 creat is ok。
  • 实现:
bool QtGuiApplication6::creatXml(const QString& path, const QString& verEnc, const QString& rootname)
{
   //创建xml文件
   QFile file(path);
   if (!file.open(QFile::WriteOnly | QFile::Truncate)) return false;

   QDomDocument doc;

   //写入xml头部
   QDomProcessingInstruction instruction;
   instruction = doc.createProcessingInstruction("xml", verEnc);
   doc.appendChild(instruction);

   QDomText text; //设置括号标签中间的值

   //添加根节点
   QDomElement root = doc.createElement(rootname);
   doc.appendChild(root);

   //输出到文件
   QTextStream out_stream(&file);
   doc.save(out_stream, 4); //缩进4格
   file.close();

   return true;
}

Xml文件节点的添加

  • 说明:在已经创建好的xml文件中,添加节点(不带有属性)
  • 函数名
bool addXml(const QString& path, const QString& nodeNmae, 
			const QString name[], const QString val[], const int num);
  • 参数说明
    const QString& path 【xml路径】,
    const QString& nodeNmae【创建节点名字】,
    const QString name[]【节点元素名字集合】,
    const QString val[]【节点元素值集合】,
    const int num【节点元素个数】
  • 调用举例
QString name[] = { "IDx","namex","agex" };
QString val[] = { m_LE_first->text(), m_LE_scond->text(), m_LE_thrend->text() };
if (addXml("text2.xml", "nodexx", name, val, 3)) qDebug() << "add is ok";
  • 举例说明:打开在当前目录下text2.xml文件 ,节点名字为nodexxt,元素名称为"IDx",“namex”,“agex”,他们对应得值分别是从控件获取的m_LE_first->text(), m_LE_scond->text(), m_LE_thrend->text(),元素个数为3。
  • 实现:
bool QtGuiApplication6::addXml(const QString& path, const QString& nodeNmae,
   								 const QString name[], const QString val[], const int num)
{
   //打开文件
   QFile file(path); //相对路径、绝对路径、资源路径都可以
   if (!file.open(QFile::ReadOnly))
   	return false;

   //读入xml
   QDomDocument doc;
   if (!doc.setContent(&file))
   {
   	file.close();
   	return false;
   }
   file.close();

   QDomText text; //设置括号标签中间的值

   QDomElement root = doc.documentElement();

   QDomElement node = doc.createElement(nodeNmae);
   //book.setAttribute("id",1); //方式一:创建属性  其中键值对的值可以是各种类型
   //QDomAttr time=doc.createAttribute("time"); //方式二:创建属性 值必须是字符串
   //time.setValue("2013/6/13");
   //book.setAttributeNode(time);

   for (int i = 0; i < num; i++)
   {
   	QDomElement xml_id = doc.createElement(name[i]);		//创建子元素1
   	text = doc.createTextNode(val[i]);
   	xml_id.appendChild(text);
   	node.appendChild(xml_id);
   }

   root.appendChild(node);

   if (!file.open(QFile::WriteOnly | QFile::Truncate)) //如果不用truncate就是在后面追加
   	return false;

   //输出到文件
   QTextStream out_stream(&file);
   doc.save(out_stream, 4); //缩进4格
   file.close();

   return true;
}

Xml文件节点元素值的输出

  • 说明:在已经创建好的xml文件中,找到匹配的节点的元素,并输出其值
  • 函数名
QString readXml(const QString& path, const QString& keynode, const QString& key);
  • 参数说明
    const QString& path【路径】,
    const QString& keynode【寻找节点名称】,
    const QString& key【元素的名称】
  • 调用举例
QString readText = readXml("text2.xml", "node", "ID");
  • 举例说明:打开在当前目录下text2.xml文件 ,找到节点名字为node,输出玉元素名为“ID“的值
  • 实现:
QString QtGuiApplication6::readXml(const QString& path, const QString& keynode, const QString& key)
{
   QString readText;
   int k = 1;
   //打开或创建文件
   QFile file(path); //相对路径、绝对路径、资源路径都行
   if (!file.open(QFile::ReadOnly))
   	return NULL;

   QDomDocument doc;
   if (!doc.setContent(&file))
   {
   	file.close();
   	return NULL;
   }
   file.close();

   QDomElement root = doc.documentElement(); //返回根节点
   qDebug() << root.nodeName();
   QDomNode node = root.firstChild(); //获得第一个子节点

   while (!node.isNull())
   {
   	if (node.isElement() && node.nodeName() == keynode) //如果节点是元素
   	{

   		QDomElement e = node.toElement(); //转换为元素,注意元素和节点是两个数据结构,其实差不多
   		QDomNodeList list = e.childNodes();

   		for (int i = 0; i<list.count(); i++) //遍历子元素,count和size都可以用,可用于标签数计数
   		{
   			QDomNode n = list.at(i);
   			if (node.isElement())
   			{
   				if (n.nodeName() == key)
   				{
   					readText = n.nodeName() + ":" + n.toElement().text();
   					node = node.nextSibling();
   					if(node.nodeName() == keynode) return	readText+" (have more)";
   					return	readText;
   				}
   			}
   		}

   	}
   	//node = node.nextSibling(); //下一个兄弟节点,nextSiblingElement()是下一个兄弟元素,都差不多
   }

   return NULL;
}

Xml文件节点删除

  • 说明:在已经创建好的xml文件中,删除到匹配的节点
  • 函数名
bool removeXmlNode(const QString& path, const QString& key, const QString& val);
  • 参数说明
    const QString& path【路径】,
    const QString& key【元素的名称】,
    const QString& val【元素值】
  • 调用举例
if (removeXmlNode("text2.xml", "ID", "3"))qDebug() << "remove is ok";
  • 举例说明:打开在当前目录下text2.xml文件 ,删除元素名为“ID“的值诶“3”的节点
  • 实现:
bool QtGuiApplication6::removeXmlNode(const QString& path, const QString& key, const QString& val)
{
   //打开或创建文件
   QFile file(path); //相对路径、绝对路径、资源路径都行
   if (!file.open(QFile::ReadOnly))
   	return false;

   QDomDocument doc;
   if (!doc.setContent(&file))
   {
   	file.close();
   	return false;
   }
   file.close();

   QDomElement root = doc.documentElement(); //返回根节点

   QDomNode node = root.firstChild(); //获得第一个子节点

   while (!node.isNull())
   {
   	if (node.isElement()) //如果节点是元素
   	{

   		QDomNodeList list = node.childNodes();

   		for (int i = 0; i<list.count(); i++) //遍历子元素,count和size都可以用,可用于标签数计数
   		{
   			QDomNode n = list.at(i);
   			if (node.isElement())
   			{
   				if (n.nodeName() == key && n.toElement().text() == val)
   				{
   					qDebug() << n.nodeName() << ":" << n.toElement().text();
   					//node.removeChild(list.at(i)); //删除属性
   					root.removeChild(node);
   				}
   			}
   		}

   	}
   	node = node.nextSibling(); //下一个兄弟节点,nextSiblingElement()是下一个兄弟元素,都差不多

   }
   if (!file.open(QFile::WriteOnly | QFile::Truncate))
   	return false;
   //输出到文件
   QTextStream out_stream(&file);
   doc.save(out_stream, 4); //缩进4格
   file.close();

   return true;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值