在下面的随笔中,我会根据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