QT操作xml文件封装类(读、写、添加、删除)

#ifndef _XML_HANDLE_H
#define _XML_HANDLE_H

#include "Windows.h"
#include <shlwapi.h>
#include <QtXml/QDomDocument>
#include <QFile>
#include <qDebug>

#pragma comment(lib, "QtXmld4.lib")
#pragma comment(lib,"shlwapi.lib")

class XMLHandle
{
public:
	XMLHandle(void);
	~XMLHandle(void);

public:
	BOOL CreateMultiDir(char* szPathDir);

	void readXML(char* xmlpath);
	void writeXML(char* xmlpath);
	void AddXMl(QString strnumber);
	void RemoveXMl(QString strnumber);

public:
	QVector<QString> m_vNumber;

};

#endif




#include "XMLHandle.h"


XMLHandle::XMLHandle(void)
{
}


XMLHandle::~XMLHandle(void)
{
}

BOOL XMLHandle::CreateMultiDir(char* szPathDir)
{
	char szPath[MAX_PATH] = {0};
	char szbuf[MAX_PATH] = {0};
	BOOL bFlag = FALSE;

	strcpy_s(szPath,szPathDir);
	int nLen = strlen(szPath);
	if(nLen <= 3)
		return FALSE;
	
	for (int i = 0;i < nLen;i++)
	{
		if (szPath[i] == '\\' || szPath[i] == '/')
		{
			if (!PathFileExistsA(szbuf))
			{
				if(!CreateDirectoryA(szbuf,NULL))
					return FALSE;
			}
	
			szbuf[i] = szPath[i];
			bFlag = TRUE;
		} 
		else
		{
			szbuf[i] = szPath[i];
		}
	}
	return TRUE;
}

void XMLHandle::readXML(char* xmlpath)
{
	//打开或创建文件
	QFile file(xmlpath); //相对路径、绝对路径、资源路径都行
	if(!file.open(QFile::ReadOnly))
		return;

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

	/*返回根节点*/
	QDomElement root=doc.documentElement(); 
	qDebug()<<root.nodeName();

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

	/*如果节点不空*/
	while(!node.isNull())  
	{
		/*如果节点是元素*/
		if(node.isElement()) 
		{
			/*转换为元素*/
			QDomElement e=node.toElement(); 

			/* 打印键值对,tagName和nodeName是一个东西*/
			//qDebug()<<e.tagName()<<" "<<e.attribute("id")<<" "<<e.attribute("time");
			QDomNodeList list=e.childNodes();

			/*遍历子元素,count和size都可以用,可用于标签数计数*/
			for(int i=0;i<list.count();i++) 
			{
				QDomNode n=list.at(i);
				if(node.isElement())
					m_vNumber.push_back(n.toElement().text());
					//qDebug()<<n.nodeName()<<":"<<n.toElement().text();
			}
		}
		/*下一个兄弟节点,nextSiblingElement()是下一个兄弟元素,都差不多*/
		node=node.nextSibling(); 
	}
}

void XMLHandle::writeXML(char* xmlpath)
{
	/*可以用QIODevice,Truncate表示清空原来的内容*/
	QFile file(xmlpath); 
	if(!file.open(QFile::WriteOnly|QFile::Truncate)) 
		return;

	if(m_vNumber.size() == 0)
		return;

	QDomDocument doc;
	//写入xml头部
	QDomProcessingInstruction instruction; //添加处理命令
	instruction=doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
	doc.appendChild(instruction);
	//添加根节点
	QDomElement root=doc.createElement("library");
	doc.appendChild(root);
	//添加第一个子节点及其子元素
	QDomElement NumberList=doc.createElement("NumberList");

	//方式一:创建属性  其中键值对的值可以是各种类型 
	NumberList.setAttribute("id","zzc");  

	//方式二:创建属性 值必须是字符串  
	QDomAttr time = doc.createAttribute("time"); 
	time.setValue("2018-07-30");
	NumberList.setAttributeNode(time); 

	QVector<QString>::Iterator iter;
	for (iter = m_vNumber.begin();iter != m_vNumber.end();iter++)
	{
		QDomElement Number=doc.createElement("Number"); //创建子元素
		QDomText text; //设置括号标签中间的值
		text=doc.createTextNode(((*iter).trimmed()));
		NumberList.appendChild(Number);
		Number.appendChild(text);
	}
	root.appendChild(NumberList);

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

void XMLHandle::AddXMl(QString strnumber)
{
	QFile file("data1.xml"); 
	if(!file.open(QFile::ReadOnly))
		return;

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

	/*获取根节点*/
	QDomElement root=doc.documentElement();

	/*获取根节点下面的子节点*/
	QDomNode node=root.firstChild();

	if (!node.isNull())
	{
		QDomElement e=node.toElement(); 
		QDomElement Number=doc.createElement("Number"); 

		/*设置括号标签中间的值*/
		QDomText text;
		text=doc.createTextNode(strnumber);
		m_vNumber.push_back(strnumber);
		
		Number.appendChild(text);
		e.appendChild(Number);
	}

	/*先读进来,再重写,如果不用truncate就是在后面追加内容,就无效了*/
	if(!file.open(QFile::WriteOnly|QFile::Truncate)) 
		return;

	QTextStream out_stream(&file);
	doc.save(out_stream,4); 
	file.close();
}

void XMLHandle::RemoveXMl(QString strnumber)
{
	QFile file("data1.xml"); 
	if(!file.open(QFile::ReadOnly))
		return;

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

	//一定要记得关掉啊,不然无法完成操作
	file.close();  

	QDomElement root=doc.documentElement();
	QDomNode node=root.firstChild();
	if (!node.isNull())
	{
		QDomNodeList list= node.childNodes();
		for(int i = 0;i < list.count();i++)
		{
			QDomElement e=list.at(i).toElement();
			QString strText = e.text();
			strText = strText.trimmed();

			if ((strText.compare(strnumber)) == 0)
			{
				node.removeChild(list.at(i));
			}
		}
	}

	if(!file.open(QFile::WriteOnly|QFile::Truncate))
		return;

	QTextStream out_stream(&file);
	doc.save(out_stream,4); 
	file.close();
}

xml测试用例:

<?xml version="1.0" encoding="gb2312" ?>
<Root>
	<NumberList id = "zzc" time = "2018-07-30">
		<Number> 13823400111 </Number>
		<Number> 14006221455 </Number>
		<Number> 14108768991 </Number>
		<Number> 14209779092 </Number>
		<Number> 14377678970 </Number>
		<Number> 15809876890 </Number>
		<Number> 13903498722 </Number>
		<Number> 14283793222 </Number>
		<Number> 14207627829 </Number>
		<Number> 14109889072 </Number>
		<Number> 14309889248 </Number>
	</NumberList>
</Root>

猜你喜欢

转载自blog.csdn.net/u012372584/article/details/81281475