-
CMakeLists.txt
cmake_minimum_required(VERSION 3.5)
project(qtXML2Map LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(Qt5Core)
add_executable(qtXML2Map
main.cpp
util.cpp util.h)
target_link_libraries(qtXML2Map Qt5::Core)
-
config.xml
<?xml version="1.0" encoding="GBK"?>
<persons name="QT">
<person id="Protocol1">
<name>wang</name>
<age>14</age>
<email>wang@sina.com</email>
<website>www.sina.com</website>
</person>
<person id="Protocol2">
<a>sugon</a>
<b>25</b>
<c>wang@sugon.com</c>
<d>www.sugon.com</d>
</person>
</persons>
-
util.h
//
// Created by dengch on 2023/9/1.
//
#ifndef UTIL_H
#define UTIL_H
#include <QString>
#include <QMap>
class util {
private:
QString m_path;
QMap<QString, QString> m_map;
void xml2map();
public:
util(const QString &path);
QMap<QString, QString> getMap();
};
#endif //QTXML2MAP_UTIL_H
-
util.cpp
//
// Created by dengch on 2023/9/1.
//
#include <QFile>
#include <QXmlStreamReader>
#include "QDebug"
#include "util.h"
#include "iostream"
using namespace std;
/**
* 返回字典
* @return
*/
QMap<QString, QString> util::getMap() {
xml2map();
return m_map;
}
/**
* 从xml配置文件读取配置信息到map
* @param path
*/
void util::xml2map() {
if (m_path.isEmpty()) {
return;
}
QFile *file = new QFile(m_path);
if (!file->open(QFile::ReadOnly | QFile::Text)) {
return;
}
QXmlStreamReader xml(file);
QString id;
while (!xml.atEnd() && !xml.hasError()) {
QXmlStreamReader::TokenType token = xml.readNext();
if (token == QXmlStreamReader::StartDocument) {
continue;
}
if (token == QXmlStreamReader::StartElement) {
if (xml.name() == "persons") {
continue;
}
if (xml.name() == "person") {
QXmlStreamAttributes attributes = xml.attributes();
if (attributes.hasAttribute("id")) {
id = attributes.value("id").toString();
}
while (!(xml.tokenType() == QXmlStreamReader::EndElement && xml.name() == "person")) {
if (xml.tokenType() == QXmlStreamReader::StartElement && xml.name() != "person") {
QString temp = id;
QString key = temp.append("/").append(xml.name());
QString value = xml.readElementText();
m_map.insert(key, value);
qDebug() << "map[" << key << "]=" << value;
}
xml.readNext();
}
}
}
}
if (xml.hasError()) {
qDebug() << xml.errorString();
}
if (xml.atEnd()) {
}
file->close();
}
/**
* 构造函数传入xml配置文件路径
* @param path
*/
util::util(const QString &path) {
m_path = path;
}
-
main.cpp
#include <QCoreApplication>
#include "util.h"
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
util *u = new util("C:\\Users\\dengch\\Desktop\\CLionProj\\qtXML2Map\\config.xml");
u->getMap();
return QCoreApplication::exec();
}
map[ "Protocol1/name" ]= "wang"
map[ "Protocol1/age" ]= "14"
map[ "Protocol1/email" ]= "wang@sina.com"
map[ "Protocol1/website" ]= "www.sina.com"
map[ "Protocol2/a" ]= "sugon"
map[ "Protocol2/b" ]= "25"
map[ "Protocol2/c" ]= "wang@sugon.com"
map[ "Protocol2/d" ]= "www.sugon.com"