qt xml组包_Qt中三种解析xml的方式

这篇博客介绍了Qt中三种解析XML的方式:QXmlStreamReader、DOM(QDomDocument)和QXmlSimpleReader,并通过一个学校师生信息的XML示例进行代码展示。作者讨论了每种方法的代码量、逻辑复杂性、内存占用和运行时间,指出DOM方法适合小型XML文件,而QXmlStreamReader和QXmlSimpleReader适合大型或频繁调用的场景。
摘要由CSDN通过智能技术生成

在下面的随笔中,我会根据xml的结构,给出Qt中解析这个xml的三种方式的代码。虽然,这个代码时通过调用Qt的函数实现的,但是,很多开源的C++解析xml的库,甚至很多其他语言解析xml的库,都和下面三种解析xml采用相同的原理,所以就算你不是学习qt,也可以大致参看一下代码,对三种解析方式有一种大致的感觉。

先给出xml如下:

30

soccer

32

swimming

20

dancing

21

running

下面给出qt中解析xml的三种方式,通过解析xml,创建student列表和teacher列表。先给出存储的结构体和辅助函数:

#include #include

namespaceSchool

{structTeacher

{

std::stringname;intage;

std::stringloveSport;

Teacher(std::string name_, int age_, std::stringloveSport_)

: name(std::move(name_)), age(age_), loveSport(std::move(loveSport_))

{

}

};structStudent

{

std::stringname;intage;

std::stringloveSport;

Student(std::string name_, int age_, std::stringloveSport_)

: name(std::move(name_)), age(age_), loveSport(std::move(loveSport_))

{

}

};

inlinevoid print(std::ostream &out, const Teacher&teacher)

{out << "teacher:" << teacher.name <<:endl teacher.age sport: teacher.lovesport>

}

inlinevoid print(std::ostream& out, const Student&student)

{out << "student:" << student.name <<:endl student.age sport: student.lovesport>

}

}

另外需要注意在.pro中添加

QT += xml

(1)通过QXmlStreamReader:

#include #include"schooldefine.h"

classXmlStreamReader

{public:

XmlStreamReader();bool readFile(const QString&fileName);voidprintAllMembers();private:voidreadSchoolMembers();voidreadTeacherMembers();void readTeacher(const QStringRef&teacherName);voidreadStudentMembers();void readStudent(const QStringRef&studentName);voidskipUnknownElement();

QXmlStreamReader reader;

std::vector<:teacher>m_teachers;

std::vector<:student>m_students;

};

#include "XmlStreamReader.h"#include#include#includeXmlStreamReader::XmlStreamReader()

{

}bool XmlStreamReader::readFile(const QString &fileName)

{

QFile file(fileName);if (!file.open(QFile::ReadOnly |QFile::Text))

{

std::cerr<< "Error: Cannot read file" <

}

reader.setDevice(&file);

reader.readNext();while (!reader.atEnd())

{if(reader.isStartElement())

{if (reader.name() == "school")

{

readSchoolMembers();

}else{

reader.raiseError(QObject::tr("Not a school file"));

}

}else{

reader.readNext();

}

}

file.close();if(reader.hasError())

{

std::cerr<< "Error: Failed to parse file"

<< qPrintable(fileName) << ":"

<< qPrintable(reader.errorString()) <<:endl fals

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值