QT xml 读写

最近用QT在做一个项目,需要存储设备信息。

deviceInfo.h文件:

#include <QWidget>#include <QtCore>
#include <QString>
#include <QFile>
#include <QVector>
#include <QtXml/QDomDocument>
#include <QtXml/QDomNodeList>
#include <QtXml/QDomElement>
#include <QtXml/QDomAttr>

class devicesInfo
{
//    Q_OBJECT
public:
    devicesInfo();
    ~devicesInfo();

private:
    QDomDocument doc;
    QString fileName;

//内部接口
private:
    void readXmlFile(); //读取xml文件

//外部接口
public:
    //获得ip地址的设备信息
    void getADeviceInfo(QString ip,QVector<QString> &deviceInfoVec);  
    //刷新设备信息到xml文件中
    void updateDeviceInfoXml(QString ip,QVector<QString> &deviceInfoVec);
};

deviceInfo.cpp文件:
devicesInfo::devicesInfo(){
    fileName = "devices.xml";
}

devicesInfo::~devicesInfo()
{

}

void devicesInfo::getADeviceInfo(QString ip, QVector<QString> &deviceInfoVec){
    //xml文件读到内存
    readXmlFile();
    //读取内存中的设备信息
    //获取根节点
    QDomElement root = doc.documentElement();

    QString tempInfo;
    QDomNode deviceNode = root.firstChild();
    for( ; !deviceNode.isNull(); deviceNode = deviceNode.nextSibling()){
        if(deviceNode.isElement()){
            QDomElement element = deviceNode.toElement();
            QDomNodeList deviceInfoList = element.childNodes();
            QString ipAdress = deviceInfoList.at(0).toElement().text();
            if(ipAdress != ip){
                //ip地址不匹配,则进入下次循环
                continue ;
            }
            //ip地址匹配,则把相应的设备信息放到vector中
            for(int i=1; i<deviceInfoList.count(); i++){
                QDomNode nodechild = deviceInfoList.at(i);
                if(nodechild.isElement()){
                    tempInfo = nodechild.toElement().tagName() + ":" + nodechild.toElement().text();
                    deviceInfoVec.push_back(tempInfo);
                }
            }//end of for(内循环)
            //获取信息后返回,没有必要继续寻找
            return ;
        }
    }//end of for(外循环)
}
void devicesInfo::updateDeviceInfoXml(QString ip, QVector<QString> &deviceInfoVec){
    //读取xml文件到内存
    readXmlFile();
    //更新内存中的设备信息
    //获取根节点
    QDomElement root = doc.documentElement();

    QStringList tempInfoList;
    QDomNode deviceNode = root.firstChild();
    //记录每个设备中的属性信息是否成功更新,如果没有更新成功,则需要增加一个设备属性,默认是没有更新
    bool updateAttrInfoBool;
    //xml中这次需要更新的每个设备属性对应一个bool值,这次用户更新的设备信息中仍有该属性则true,否则false
    QVector<bool> xmlDeviceInfoBoolVec;
    qDebug() << "in update function:" << endl;
    //顺利遍历,寻找相应的ip地址,更新其中的设备信息
    for( ; !deviceNode.isNull(); deviceNode = deviceNode.nextSibling()){
        if(deviceNode.isElement()){
            QDomElement deviceElement = deviceNode.toElement();
            QDomNodeList deviceInfoList = deviceElement.childNodes();
            QString ipAdress = deviceInfoList.at(0).toElement().text();
            if(ipAdress != ip){
                //ip地址不匹配,则跳出本循环,进入下次循环
                qDebug() << "xml 中的 ip:" << ipAdress << " out." << endl;
                continue ;
            }
            //ip地址匹配
            //xml中的该匹配设备每个属性设置一个对应的 bool 值,并且默认是false
            for(int i=0; i<deviceInfoList.size(); i++){
                bool tempBool = false;
                xmlDeviceInfoBoolVec.push_back(tempBool);
            }
            //则把deviceInfoVec中的设备信息更新到该节点中
            for(int i=0; i<deviceInfoVec.size(); i++){
                updateAttrInfoBool = false;
                //把vec中的设备信息以“:” 分开,前面为tagname,后面为信息,并且跳过其中的空格
//                qDebug() << "第" << i << "行设备信息:" << deviceInfoVec[i] << endl;
                tempInfoList = deviceInfoVec[i].split(":",QString::SkipEmptyParts);
//                qDebug() << "ui : tagName : " << tempInfoList[0] << "deviceInfo : " << tempInfoList[1] << endl;
                //在内存中的ip设备信息中寻找tagName和用户输入的相匹配的,然后判断后面的信息是否一致
                for(int j=1; j<deviceInfoList.size(); j++){
                    //第 0 个是 ip 地址,所以从 j=1 开始
//                    qDebug() << "  xml : tagName:" <<  deviceInfoList.at(j).toElement().tagName()
//                             << "  deviceInfo:" << deviceInfoList.at(j).toElement().text() << endl;
                    if(tempInfoList[0] == deviceInfoList.at(j).toElement().tagName()){
                        //主要为真,则说明,xml文件和用户输入中都还有这个属性,则这个属性应该在更新完继续存在,也肯定会更新
                        xmlDeviceInfoBoolVec[j] = true;
                        updateAttrInfoBool = true;
                        if(tempInfoList[1] != deviceInfoList.at(j).toElement().text()){
                            //如果不一致,则更新
                            deviceInfoList.at(j).toElement().firstChild().setNodeValue(tempInfoList[1]);
                            //跳出本次更新设备属性信息的循环
                            break;
                        }
                    }
                }
                if(updateAttrInfoBool == false){
                    //如果没有更新成功,则增加一个设备属性
                    QDomElement deviceAttrInfo = doc.createElement(tempInfoList[0]);
                    QDomText text = doc.createTextNode(tempInfoList[1]);
                    deviceAttrInfo.appendChild(text);
                    deviceElement.appendChild(deviceAttrInfo);
                }
            }
            //根据用户输入的设备更新信息,删除xml中有的但是更新后应该没有的
            for(int i=1; i<deviceInfoList.size(); i++){
                if(xmlDeviceInfoBoolVec[i] == false){
                    //如果为假,删除该设备属性
                    deviceElement.removeChild(deviceInfoList.at(i));
                }
            }
            //内存中的设备信息写到xml文件
            QFile file(fileName);
            if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate)){
                qDebug() << "open for add error!";
            }
            QTextStream out(&file);
            doc.save(out,4);
            file.close();
            //返回
            return ;
        }
    }//end of for(外循环)
}

参考资料:http://www.cnblogs.com/cy568searchx/p/3628601.html
时间: 2025-01-04 03:06:01

QT xml 读写的相关文章

Qt XML读取写入操作

XML(eXtensible Markup Language,可扩展标记语言)是普通用于数据交换和数据存储的一种多用途文本文件格式: SVG(可标量矢量图形)XML格式,QtSvg模块提供了可用于载入并呈现SVG图像的类: MathML(数学标记语言)XML格式的绘制文档,可以使用Qt Solution中的QtMmlWidget操作: 对于一般的XML数据处理,Qt提供了QtXml模块,QtXml提供了三种不同的应用程序接口来读取XML文档: 1.QXmlStreamReader 用于读取格式良

XML读写

private string fileName = HttpContext.Current.Server.MapPath("~/Student.xml"); protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { GetAllStudent(); } } private void GetAllStudent() { ddlStudent.Items.Clear(); XmlDocument do

unity3d里的XML读写示例

关于U3D里面XML读写办法,谢谢刘老师的指导(刘国栋) 代码: /**Project name:*    *Author:*    *Version:*    *Description:*    */ using UnityEngine;using System.Collections;using System.Xml;using System.Xml.Serialization;using System.IO;using System.Text;using System.Security.C

Qt XML的使用

Qt中对于XML文件的写入有两种方式,一个是使用QXmlStreamWriter,另一个则为使用Dom.stream流的形式相对来说更加灵活,而且适合处理大文件.Dom方式由于是将内容加载到了内存中进行操作,所以对于小内存设备则有一定得局限性. 根据<QtCreator快速入门>和网上的一些例子练习了Qt XML的使用,做一个记录,以下是采用Dom方式实现的 实现界面 编写的XML文件 1 <?xml version="1.0" encoding="UTF-

【Python】Python XML 读写

class ACTIVE_FILE_PROTECT_RULE_VIEW(APIView): renderer_classes = (JSONRenderer, BrowsableAPIRenderer) parser_classes = (JSONParser,) def post(self, request): from datetime import datetime from django.utils import timezone from django.utils.timezone i

XML 读写-JDOM和DOM4j

一.JDOM的XML读写 1.JDOM的XML 读 1 import java.io.File; 2 import java.io.IOException; 3 import java.util.Iterator; 4 import java.util.List; 5 import org.jdom.Document; 6 import org.jdom.Element; 7 import org.jdom.JDOMException; 8 import org.jdom.input.SAXBu

oracle blob mybatis xml读写

最近项目用到了对oracle大字段的读写,小白在这里记录下,方便自己以后用到,也希望对其他朋友有一点帮助. 由于项目的原因,这里的blob只是对xml报文的读写,并没有涉及到保存图片等,因此下面涉及的方法可能不全面,如有需要请自行查看其它大神博客. 一.读blob 这里对blob的读是直接在数据库建了一个函数Blob_To_Varchar ,这样方便项目里面其它地方用到查询blob: CREATE OR REPLACE Function Blob_To_Varchar (Blob_In In B

xml读写Demo

主要包括: 使用xmlDocument的方式读写xml文档,读取xml字符串. 使用XDocument的方式读写xml文档,读取xml字符串. 将xml中的数据递归加载到winform的Treeview中. 代码下载地址:http://files.cnblogs.com/files/FangZhaohu/Xml%E8%AF%BB%E5%86%99%E7%BB%83%E4%B9%A0.zip 以后需要补充: XDocument与Linq XmlDocument与Xpath xml的一些其他知识.

C# XML读写实例

一.使用System.Xml 实例:完成如下格式配置文件的读写操作: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE doc[]> <root> <DatabaseInfo> <HostName>127.0.0.1</HostName> <DatabaseName>orcl</DatabaseName> <UserN