#include <QApplication>
#include <QCoreApplication>
#include <QFile>
#include <QXmlStreamReader>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <iostream>
struct ErrorInfo
{
unsigned int id;
std::string text;
};
void Help()
{
std::cout << "Xml2JSON" << std::endl;
std::cout << "Usage: Xml2JSON source_file dest_file" << std::endl;
}
void ParseElement(QXmlStreamReader &reader, QJsonObject &json_object) {
auto attributes = reader.attributes();
// 处理元素的属性
for (const QXmlStreamAttribute &attr : attributes) {
json_object.insert(attr.name().toString(), QJsonValue(attr.value().toString()));
}
while (!reader.atEnd()) {
auto token_type = reader.readNext();
if (token_type == QXmlStreamReader::StartElement) {
QString name = reader.name().toString();
QJsonObject child_object;
ParseElement(reader, child_object); // 递归处理子元素
if (json_object.contains(name)) {
QJsonValue value = json_object.value(name);
if (value.isArray()) {
QJsonArray json_array = value.toArray();
json_array.append(child_object);
json_object.insert(name, json_array);
}
else {
QJsonArray json_array;
json_array.append(value);
json_array.append(child_object);
json_object.insert(name, json_array);
}
}
else {
json_object.insert(name, child_object);
}
}
else if (token_type == QXmlStreamReader::EndElement || token_type == QXmlStreamReader::EndDocument) {
break;
}
else if (token_type == QXmlStreamReader::Characters && !reader.isWhitespace()) {
// 处理元素的文本内容
json_object.insert("text", reader.text().toString());
}
}
}
void Convert(const QString &source_file, const QString &dest_file)
{
std::cout << "Processing..." << std::endl;
QFile xml_file(source_file);
QFile json_file(dest_file);
if (!xml_file.open(QIODevice::ReadOnly))
{
ErrorInfo error;
error.id = 1;
error.text = "Open xml file failed!";
throw error;
}
if (!json_file.open(QIODevice::WriteOnly))
{
ErrorInfo error;
error.id = 2;
error.text = "Open json file failed!";
throw error;
}
QXmlStreamReader reader(&xml_file);
QJsonDocument json_doc;
QJsonObject json_object;
ParseElement(reader, json_object);
json_doc.setObject(json_object);
json_file.write(json_doc.toJson());
}
推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家:
零声白金学习卡(含基础架构/高性能存储/golang云原生/音视频/Linux内核)
https://xxetb.xet.tech/s/3Zqhgt