XML文件读写

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

你可能感兴趣的:(Qt,编程,xml,c++,qt)