#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>