0、.pro文件添加依赖
QT += xml
1、使用 QDomDocument 方式
#include
#include
#include
#include
#include
#include
bool Widget::WriteXmlFile(const QString fileName)
{
//创建QDomDocument对象
QDomDocument xDoc;
QDomProcessingInstruction inStruction;
//写入xml文件头(xml版本信息和编码信息)
inStruction = xDoc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
xDoc.appendChild(inStruction);
//创建根节点并将其添加到xDoc中
QDomElement root = xDoc.createElement("root");
xDoc.appendChild(root);
//创建子节点1
QDomElement childNode1 = xDoc.createElement("childNode1");
//为子节点childNode1设置属性及属性值
childNode1.setAttribute("AttributeKey", "AttributeValue");
//! 为子节点childNode1添加节点值
//! 创建QDomText对象并设置其值
QDomText nodeVal = xDoc.createTextNode("childNode1 Value");
//使用QDomElement对象的节点,添加节点值需添加QDomText对象,否则有可能不显示该值
childNode1.appendChild(nodeVal);
//将子节点1添加到根节点中
root.appendChild(childNode1);
//! 创建一个多级节点childNode2
//创建多级节点2
QDomElement childNode2 = xDoc.createElement("childNode2");
//为多级节点childNode2设置属性及属性值
childNode2.setAttribute("AttributeKey", "AttributeValue");
//创建多级节点的子节点1
QDomElement cChildNode1 = xDoc.createElement("childNode2_1");
//设置cChildNode1的属性和值
cChildNode1.setAttribute("ww", 1);
//设置cChildNode1的节点值
cChildNode1.appendChild(xDoc.createTextNode("childNode2_1 Value"));
//将cChildNode1节点添加到多级节点中
childNode2.appendChild(cChildNode1);
//创建多级节点的子节点2
QDomElement cChildNode2 = xDoc.createElement("childNode2_2");
//设置cChildNode2的属性和值
cChildNode2.setAttribute("mm", 2);
//设置cChildNode2的节点值
cChildNode2.appendChild(xDoc.createTextNode("childNode2_2 Value"));
//将cChildNode2节点添加到多级节点中
childNode2.appendChild(cChildNode2);
//将多级节点childNode2添加到根节点中
root.appendChild(childNode2);
//指定xml文件路径
QFile file("./test.xml");
//以只读方式打开,并且会清空文件内容
if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
{
return false;
}
//使用文本流写入文件
QTextStream outputStream(&file);
xDoc.save(outputStream, 4); //缩进四格
file.close();
return true;
}
bool Widget::ReadXmlFile(const QString fileName)
{
//创建QDomDocument对象
QDomDocument xDoc;
//指定读取的xml文件路径
QFile file("./test.xml");
//xml文件以只读方式打卡
if (!file.open(QIODevice::ReadOnly))
{
return false;
}
//调用setContent函数设置数据源
if (!xDoc.setContent(&file))
{
file.close();
return false;
}
file.close();
//获取xDoc中的QDomElement对象
QDomElement docElem = xDoc.documentElement();
//获取docElem的根节点
QDomNode node = docElem.firstChild();
//!获取第一个子节点,并读取其属性及其值
QDomElement childNode1 = node.toElement();
//获取childNode1的属性值
QString attri1 = childNode1.attribute("AttributeKey");
//获取childNode1的节点值(既然设置节点值需要插入子节点,那么读取也应读取其子节点)
QDomNode node1Child = childNode1.firstChild();
QString node1Val = node1Child.nodeValue();
//输出属性值和节点值
qDebug() << "子节点1的属性值: " << attri1;
qDebug() << "子节点1的节点值: " << node1Val;
//将节点移至下一节点的位置
node = node.nextSibling();
//! 获取第二个节点,并使用循环获取其中的各值
QDomElement childNode2 = node.toElement();
//获取childNode1的属性值
QString attri2 = childNode2.attribute("AttributeKey");
qDebug() << "子节点2的属性值: " << attri2;
//获取第二节点中的第一子节点
QDomNode childNode2_ = childNode2.firstChild();
while(!childNode2_.isNull())
{
//获取当前子节点的对象
QDomElement e = childNode2_.toElement();
if(!e.isNull())
{
qDebug() << "子节点2的节点值: " << e.firstChild().nodeValue();
}
//获取下一节点元素
childNode2_ = childNode2_.nextSibling();
}
return true;
}
2、使用 QXmlStreamReader 方式
#include
#include
#include
#include
bool Widget::ReadXmlFile2(const QString fileName/* = ""*/)
{
{
QString str;
QFile file("./text.xml");
if(!file.open(QFile::ReadOnly|QFile::Text))
{
qDebug() << "Failed to open file"; //文件打开失败
return false;
}
QXmlStreamReader reader(&file);
QXmlStreamReader::TokenType mtype = reader.readNext(); //读取下一个记号,并返回类型
if (QXmlStreamReader::StartDocument == mtype)
{
qDebug()<<"版本:"<<reader.documentVersion()<<"编码:"<<reader.documentEncoding();
}
while(!reader.atEnd())
{
if(reader.isStartElement())
{
QString STR = reader.name().toString();
if(reader.name() == "info")
{
QXmlStreamAttributes attributes = reader.attributes(); //获取元素的属性
if (attributes.hasAttribute("id"))
{
qDebug() << attributes.value("id"); //返回值是QStringRef,可以通过toString()转换成QString类型
}
if (attributes.hasAttribute("date"))
{
qDebug() << attributes.value("date");
}
}
else if (reader.name() == "name")
{
str = reader.readElementText();
qDebug() << str;
}
else if(reader.name() == "age")
{
str = reader.readElementText();
qDebug() << str << endl;
}
}
else if (reader.isEndElement())
{
if(reader.name() == "info")
{
qDebug()<<endl;
}
}
mtype = reader.readNext();
}
file.close();
}
return true;
}
bool Widget::WriteXmlFile2(const QString fileName/* = ""*/)
{
{
QString name[]={"name1","name2","name3","name4"};
QString date[]={"20230101","20230201","20230301","20230401"};
QFile file("./text.xml");
if(!file.open(QFile::WriteOnly|QFile::Text))
{
qDebug()<< "file cannot open";
return false;
}
QXmlStreamWriter stream(&file);
stream.setAutoFormatting(true); //自动化格式,提高可读性
//这里可以分别设置编码、版本1.0。或者直接调用writeStartDocument()默认生成
//stream.setCodec("gb2312"); // 设置encoding="gb2312"
//stream.writeStartDocument("1.0", true); // 开始文档(XML 声明)
stream.writeStartDocument(); // 默认:
stream.writeStartElement("root");
for (int i = 0; i < 4; i++)
{
stream.writeStartElement("info");
stream.writeAttribute("id", QString::number(i+1));
stream.writeAttribute("date", date[i]);
stream.writeTextElement("name",name[i]);
stream.writeTextElement("age","20");
stream.writeEndElement();
}
stream.writeEndElement();
stream.writeEndDocument();
file.close();
}
return true;
}