1、QXML通常与HTML相关联,HTML主要用来显示网页数据,而XML主要用来存储数据,Qt提供了一套操作xml的接口;
2、简单格式如下:

<?xml version='1.0' encoding='utf-8'?> // 格式头 <日销售清单> // 根节点 根元素 <日期 date="2020-12-10"> // 子元素 子节点 <时间 time="12-14-04"> <厂家>二汽神龙</厂家> <品牌>毕加索</品牌> <报价>39</报价> <数量>1</数量> <金额>39</金额> </时间> <时间 time="12-14-22"> <厂家>二汽神龙</厂家> <品牌>毕加索</品牌> <报价>39</报价> <数量>1</数量> <金额>39</金额> </时间> </日期> <日期 date="2020-12-11"> <时间 time="12-16-18"> <厂家>二汽神龙</厂家> <品牌>毕加索</品牌> <报价>39</报价> <数量>1</数量> <金额>39</金额> </时间> <时间 time="14-53-45"> <厂家>二汽神龙</厂家> <品牌>毕加索</品牌> <报价>39</报价> <数量>1</数量> <金额>39</金额> </时间> </日期> </日销售清单>
3、操作XML之前需要在工程文件下添加
QT += xml // 主要包含的头文件: #include <QDomDocument> // 文档 #include <QDomProcessingInstruction> // 标题头 #include <QDomElement> // 元素 #include <QTextStream> // 借助文本流保存数据 #include <QStringList>
4、创建XML文件
void domXML::createXML(QString filePath) { QFile file(filePath); if(true == file.exists()) // 文件存在 { qDebug() << "文件已经存在"; return; }else{ // 文件不存在才创建 bool isok = file.open(QIODevice::WriteOnly); if(true == isok) {// 创建文件成功 QDomDocument doc; // 创建XML头部格式 <?xml version='1.0' encoding='utf-8'?> QDomProcessingInstruction ins; ins = doc.createProcessingInstruction("xml","version=\'1.0\' encoding=\'utf-8\'"); // 追加元素 doc.appendChild(ins); // 根节点元素 QDomElement root = doc.createElement("日销售清单"); doc.appendChild(root); // 和上面的是平级的 // 保存 借助文本流 QTextStream stream(&file); // 文本流与文件关联 doc.save(stream,4); // 文件中4字节缩进 // 关闭文件 file.close(); }else{ // 创建文件失败 qDebug() << "文件创建失败"; return; } } }
5、XML文件中添加数据
// xml文件中添加数据 list 厂家、 品牌、报价、数量、金额 void domXML::appendXML(QString filePath, QStringList list) { QFile file(filePath); bool isok = file.open(QIODevice::ReadOnly); if(true == isok){ // 打开文件ok // file文件和xml文档对象关联 QDomDocument doc; isok = doc.setContent(&file); if(isok == true){ // 关联成功 相当于把file的内容已经读入了doc中 file.close(); //1、 获取根节点元素 QDomElement root = doc.documentElement(); // 默认获取根节点元素 // 获取当前时间 QDateTime date = QDateTime::currentDateTime(); QString dateStr = date.toString("yyyy-MM-dd"); // 2020-10-9 // 2、判断根节点有没有子节点 if(root.hasChildNodes()){ // 有子节点 // 查找最后一个子节点 QDomElement lastElm = root.lastChildElement(); // if(lastElm.attribute("date") == dateStr) // 判断是否有当天的日期 { // 有当天日期 // 写入有效数据 writeXML(doc,lastElm,list); }else{ // 没有当天日期 // 创建日期子节点 QDomElement dateElm = doc.createElement("日期"); // 创建date属性 QDomAttr dateAttr = doc.createAttribute("date"); // 设置属性值 dateAttr.setNodeValue(dateStr); // 节点和属性关联 dateElm.setAttributeNode(dateAttr); // 日期节点追加到根节点 root.appendChild(dateElm); // 写有效数据 writeXML(doc,dateElm,list); } }else{ // 没有子节点,创建子节点 // 创建日期子节点 QDomElement dateElm = doc.createElement("日期"); // 创建date属性 QDomAttr dateAttr = doc.createAttribute("date"); // 设置属性值 dateAttr.setNodeValue(dateStr); // 节点和属性关联 dateElm.setAttributeNode(dateAttr); // 日期节点追加到根节点 root.appendChild(dateElm); // 写有效数据 writeXML(doc,dateElm,list); } // 保存文件 数据还在doc中 isok = file.open(QIODevice::WriteOnly); if(true == isok){ QTextStream stream(&file); doc.save(stream,4); }else{ qDebug() << "文件打开失败"; } }else{ // 关联失败 qDebug() << "关联文档失败"; } }else{ // 打开文件err qDebug() << "打开文件失败"; return; } }
6、写入有效数据
// 写入有效数据 void domXML::writeXML(QDomDocument &doc, QDomElement &root, QStringList list) { // 获取当前时间 QDateTime time = QDateTime::currentDateTime(); QString timeStr = time.toString("hh-mm-ss"); // 18:34:23 // 创建时间节点元素 QDomElement timeElm = doc.createElement("时间"); // 创建时间节点对应的属性 QDomAttr timeAttr = doc.createAttribute("time"); // 给属性设定值 timeAttr.setNodeValue(timeStr); // 时间节点与时间属性关联起来 timeElm.setAttributeNode(timeAttr); // 时间节点追加到日期节点后面 root.appendChild(timeElm); // 创建元素 QDomElement factory = doc.createElement("厂家"); QDomElement brand = doc.createElement("品牌"); QDomElement price = doc.createElement("报价"); QDomElement num = doc.createElement("数量"); QDomElement total = doc.createElement("金额"); // 上面元素中的文本 QDomText text = doc.createTextNode(list.at(0)); factory.appendChild(text); text = doc.createTextNode(list.at(1)); brand.appendChild(text); text = doc.createTextNode(list.at(2)); price.appendChild(text); text = doc.createTextNode(list.at(3)); num.appendChild(text); text = doc.createTextNode(list.at(4)); total.appendChild(text); timeElm.appendChild(factory); timeElm.appendChild(brand); timeElm.appendChild(price); timeElm.appendChild(num); timeElm.appendChild(total); }
7、从XML文档中读取有效数据
void domXML::readXML(QString filePath, QStringList &fList, QStringList &bList, QStringList &pList, QStringList &nList, QStringList &tList) { QFile file(filePath); bool isok = file.open(QIODevice::ReadOnly); if(true == isok) { // 打开文件成功 QDomDocument doc; isok = doc.setContent(&file); // 与文档关联 if(true == isok){ // 关联成功 file.close(); // 获取当前日期 QDateTime date = QDateTime::currentDateTime(); QString dateStr = date.toString("yyyy-MM-dd"); // 获取根节点 QDomElement root = doc.documentElement(); if(root.hasChildNodes()){// 有子节点 // 找最后一个元素 QDomElement lastElm = root.lastChildElement(); if(lastElm.attribute("date") == dateStr) // 判断有没有当天的数据 { // 找出当天下的所有时间子节点 QDomNodeList list = lastElm.childNodes(); for(int i=0;i<list.size();i++){ // 转换为元素,找到节点下所有子节点 工厂、品牌 QDomNodeList subList = list.at(i).childNodes(); // factory QString factory = subList.at(0).toElement().text(); // 转换为文本 fList.append(factory); QString brand = subList.at(1).toElement().text(); // 转换为文本 bList.append(brand); QString price = subList.at(2).toElement().text(); // 转换为文本 pList.append(price); QString num = subList.at(3).toElement().text(); // 转换为文本 nList.append(num); QString total = subList.at(4).toElement().text(); // 转换为文本 tList.append(total); } }else{ // 不存在党的日期 } }else{ // 没有子节点 } }else{ // 关联失败 } }else{ // 打开文件失败 } }
8、其他

// 声明 // 创建xml文件 static void createXML(QString filePath); // xml文件中添加数据 list 厂家、 品牌、报价、数量、金额 static void appendXML(QString filePath,QStringList list); static void writeXML(QDomDocument &doc,QDomElement &root,QStringList list); static void readXML(QString filePath, QStringList &fList, QStringList &bList, QStringList &pList, QStringList &nList, QStringList &tList); // 测试 // 创建xml文件 domXML::createXML("../xmldata.xml"); //添加日期新节点 QStringList list; list <<"二汽神龙"<< "毕加索"<< "39" << "1" << "39"; domXML::appendXML("../xmldata.xml",list); QStringList fList; QStringList bList; QStringList pList; QStringList nList; QStringList tList; domXML::readXML("../xmldata.xml",fList,bList,pList,nList,tList); for(int i=0;i<nList.size();i++) { QString str = QString("%1:%2卖出了%3,单价为:%4,总价:%5") .arg(fList.at(i)) .arg(bList.at(i)) .arg(nList.at(i)) .arg(pList.at(i)) .arg(tList.at(i)); qDebug() << str; }
//写入有效数据
voiddomXML::writeXML(QDomDocument&doc,QDomElement&root,QStringListlist)
{
//获取当前时间
QDateTimetime=QDateTime::currentDateTime();
QStringtimeStr=time.toString("hh-mm-ss");//18:34:23
//创建时间节点元素
QDomElementtimeElm=doc.createElement("时间");
//创建时间节点对应的属性
QDomAttrtimeAttr=doc.createAttribute("time");
//给属性设定值
timeAttr.setNodeValue(timeStr);
//时间节点与时间属性关联起来
timeElm.setAttributeNode(timeAttr);
//时间节点追加到日期节点后面
root.appendChild(timeElm);
//创建元素
QDomElementfactory=doc.createElement("厂家");
QDomElementbrand=doc.createElement("品牌");
QDomElementprice=doc.createElement("报价");
QDomElementnum=doc.createElement("数量");
QDomElementtotal=doc.createElement("金额");
//上面元素中的文本
QDomTexttext=doc.createTextNode(list.at(0));
factory.appendChild(text);
text=doc.createTextNode(list.at(1));
brand.appendChild(text);
text=doc.createTextNode(list.at(2));
price.appendChild(text);
text=doc.createTextNode(list.at(3));
num.appendChild(text);
text=doc.createTextNode(list.at(4));
total.appendChild(text);
timeElm.appendChild(factory);
timeElm.appendChild(brand);
timeElm.appendChild(price);
timeElm.appendChild(num);
timeElm.appendChild(total);
}