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;
}