Разобрать XSD с QXmlStreamReader - PullRequest
0 голосов
/ 03 мая 2020

Мне нужно обработать некоторые XSD для выполнения операций, и мне нужно обрабатывать их как обычные XML файлы. Я хочу взять каждый элемент XSD и обработать их (например, распечатав их и их атрибуты).

Это небольшой пример:

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="name" type="xs:string"/>
</xs:schema>

Я пытался следовать этот пост для получения данных, но безуспешно. Это мой кусок кода

void XSDReader::getStructure() const {
  QFile xsdFile(m_filePath.string().c_str());
  if (!xsdFile.open(QFile::ReadOnly | QFile::Text)) {
    throw Exception("Cannot read file " + m_filePath.string() + ". Error is: " + xsdFile.errorString().toStdString());
  }
  QXmlStreamReader reader(&xsdFile);
  std::stringstream ss;
  while (reader.readNextStartElement())
  {
    ss << "Found tag: " << reader.name().toString().toStdString() << "text: " << reader.text().toString().toStdString() << "token: " << reader.tokenString().toStdString();
    for (auto& attribute : reader.attributes())
    {
      ss << "attribute name: " << attribute.name().toString().toStdString() << ", attribute value: " << attribute.value().toString().toStdString();
    }
    reader.readNext();
    ss << "tag value:" << reader.text().toString().toStdString();
    reader.skipCurrentElement();
  }
  auto s = ss.str();
}

Строка s после обработки:

Found tag: schematext: token: StartElementtag value:

Она не содержит ничего относительно xs:string или его атрибуты.

Как правильно обработать XSD для печати всех его данных?

1 Ответ

0 голосов
/ 04 мая 2020

Я хочу взять каждый элемент XSD и обработать их (например, распечатав их и их атрибуты).

Схема XML имеет сложную структуру, которая сложна обрабатывать, если вы рассматриваете XSD как XML документы. Если вы все равно попробуете, вы, скорее всего, ошибетесь.

Существуют библиотеки кодов, которые будут загружать XSD (или набор XSD) в модель в памяти. Эти библиотеки были написаны экспертами, которые понимают схему XML в деталях. Но, к сожалению, C ++ плохо обслуживается инструментами для обработки XSD, как указано в этом потоке: XML Схема для классов C ++

Я много занимался обработкой XSD в Java с использованием модели ЭДС. Это полнофункциональный набор библиотек, поддерживающий всю спецификацию XSD. Есть кривая обучения, но это будет верно для любой технологии, которую вы используете; модель данных XSD сложна.

Вы можете сказать «... но мои XSD просты». Если это так, не стесняйтесь вперед go с вашим XML подходом. Но это, вероятно, приведет к решению fr agile, которое будет нелегко поддерживать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...