qt xml解析与处理

一、QXMLStreamWriter

QXmlStreamWriter是Qt框架中提供的一个用于写入XML文档的类。它提供了一个简单的流API,允许开发者方便地生成符合XML规范的文档。

基本功能

  • 创建、修改和保存XML文件:使用QXmlStreamWriter,可以创建新的XML文件,修改现有的XML文件内容,并将结果保存到文件中。
  • 支持XML元素:包括节点、属性、命名空间等常见的XML元素。
  • 编码支持:默认情况下,QXmlStreamWriter以UTF-8编码XML,但可以通过setCodec()方法设置不同的编码。

常用函数:

使用方法

  1. 包含头文件:在使用QXmlStreamWriter之前,需要包含其头文件#include <QXmlStreamWriter>
  2. 设置写入设备:QXmlStreamWriter通过QIODevice来写入数据,因此需要先创建一个QIODevice对象(如QFile),并设置其为QXmlStreamWriter的写入设备。
  3. 写入XML内容:通过QXmlStreamWriter提供的各种方法,如writeStartDocument()、writeStartElement()、writeAttribute()、writeCharacters()、writeEndElement()和writeEndDocument()等,来构建XML文档的结构和内容。
  4. 关闭文件:完成写入后,应关闭QFile对象以释放资源。

二、QXmlStreamReader

QXmlStreamReader是Qt框架中的一个类,专门用于解析XML文档。它提供了一种基于流的、高效的读取XML数据的方式,特别适合处理大型XML文件或需要实时解析XML数据的场景。

常用函数

  • readNext():读取下一个标记,并返回其类型。
  • name():获取当前标记的名称(如果是元素标记)。
  • attributes():获取当前元素的属性集合(如果是StartElement)。
  • text():获取当前字符标记的文本内容(如果是Characters标记)。
  • isStartElement()isEndElement()等:判断当前标记的类型。
  • atEnd():判断是否已经读取到文档的末尾。
  • hasError():判断在解析过程中是否有错误发生。
  • errorString():获取发生的错误信息的字符串表示。

使用方法

  1. 创建对象:首先,需要创建一个QXmlStreamReader对象,并将其与要解析的XML文档关联起来。这可以通过将QFile对象(或其他QIODevice派生类的对象)传递给QXmlStreamReader的构造函数或调用setDevice()方法来实现。
  2. 读取标记:使用readNext()方法读取XML文档中的下一个标记。该方法会返回一个枚举值,表示读取到的标记类型(如StartElement、EndElement、Characters等)。
  3. 处理标记:根据readNext()返回的标记类型,使用相应的方法来获取和处理标记的信息。例如,如果读取到的是一个StartElement,可以使用name()获取元素名称,使用attributes()获取元素属性等。
  4. 循环读取:通常,会将readNext()方法放在一个循环中,直到读取到文档的末尾(atEnd()返回true)。
  5. 错误处理:在循环结束后,应检查是否有错误发生(hasError()返回true),如果有,则使用errorString()等方法获取错误信息并进行处理。

三、DEMO

output.xml

<?xml version="1.0" encoding="UTF-8"?>
<student>
    <id id="1">
        <name>王维</name>
        <age>15</age>
        <height>165</height>
        <weight>50</weight>
    </id>
</student>
void createXML(const QString &fileName)
{
    QFile file(fileName);
    if(!file.open(QIODevice::WriteOnly|QIODevice::Text))
    {
        return ;
    }
    QXmlStreamWriter Writer;
    Writer.setDevice(&file);//获取流
    Writer.setAutoFormatting(true);
    Writer.writeStartDocument();//添加XML说明(版本号和编码信息
    Writer.writeStartElement("student");//写入起始元素
    Writer.writeStartElement("id");
    Writer.writeAttribute("id","1");//写入属性
    Writer.writeTextElement("name","王维");
    Writer.writeTextElement("age","15");
    Writer.writeTextElement("height","165");
    Writer.writeTextElement("weight","50");
    Writer.writeEndElement();//结束id元素编辑
    Writer.writeEndElement();//结束student元素编辑
    Writer.writeEndDocument();//结束整个的编辑
    file.close();//关闭文件
}

void parseXML(const QString &fileName) {
    QFile file(fileName);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qWarning("Failed to open file.");
        return;
    }

    QXmlStreamReader reader(&file);

    while (!reader.atEnd() && !reader.hasError())
    {
        QXmlStreamReader::TokenType type = reader.readNext();
        if (type == QXmlStreamReader::StartDocument)
        {
            qDebug()<<reader.documentVersion()<<"  "<<reader.documentEncoding();//读取版本号和编码类型
            continue;
        }

        else if (type == QXmlStreamReader::StartElement)
        {
            qDebug() << "name:" << reader.name();//获取元素名
            if(reader.attributes().hasAttribute("id"))//如果有属性
            {
                qDebug() << "id:" << reader.attributes().value("id");//输出属性
            }
        }
        else if(type==QXmlStreamReader::EndElement)//获取结束元素
        {
            qDebug() << "end:" <<reader.name();
        }
        else if(type==QXmlStreamReader::Characters&&!reader.isWhitespace())
        {
            qDebug() << "text:" << reader.text();//读取内容
        }

    }

    if (reader.hasError()) {
        qWarning() << "XML Error:" << reader.errorString();
    }

    file.close();
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    createXML("output.xml");
    parseXML("output.xml");

    return a.exec();
}

qq群交流:698593923

觉得有帮助的话,打赏一下呗。。

           

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值