0
点赞
收藏
分享

微信扫一扫

《信息技术 云计算 边缘云通用技术要求》国家标准发布,九州未来参编

八卦城的酒 2024-09-06 阅读 3
c++qtxml
#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

举报

相关推荐

0 条评论