Парсинг XSD С++

199
28 февраля 2018, 09:27

Привет всем. Возникла задача, на основе XML и XSD динамически подгружать интерфейс. Написал xml и xsd файл к этой xml. Загружаю xsd файл в память, проверяю по xsd схеме xml файл,с помощью библиотеки libxml2, выводит все хорошо или есть где нибудь ошибка, но к примеру допустим все хорошо. Следующим этапом провожу парсинг xml файла средствами Qt (QXmlReader), создаю необходимые формы. Теперь необходимо, как то достать из xsd схемы значения ограничения диапазона, типы и другие атрибуты. К примеру в xsd схеме хранится диапазон для формы, пример маленького кусочка большого файла привел ниже:

<xs:element name="age">
 <xs:simpleType>
  <xs:restriction base="xs:integer">
     <xs:minInclusive value="0"/>
     <xs:maxInclusive value="120"/>
  </xs:restriction>
 </xs:simpleType>
</xs:element>

Вот мне нужно из определённого элемента в XSD достать: 1) тип integer
2) minInclusive(мин значение диапазона) - 0
3) maxInclusive(максимальное значение диапазона) - 120

На основе этих значение для формы к примеру spinBox будут заданы ограничения 1) если получили тип integer в результате парсинга xsd, будет создан объект класса QIntValidate (для делегата) и будет установлен setRange(0,120); для этого spinBox

Возможно есть ли какие нибудь библиотеки для парсинга самой XSD, а не только XML? Может кто то покажет пример xsd в libxml2, но я не нашел. Возможно кто то знает хорошие примеры, как это можно сделать или делал это когда-нибудь средствами Qt.

Answer 1

Схема XSD - это тоже файл в формате XML. Вы знаете его структуру. Можете тем-же парсером его парсить.

Например, ищете узел с тэгом "xs:element" и со свойством "name" равному "age". В нём - узел с тэгом "xs:simpleType". В нём узел с тегом "xs:restriction". В нем в узлах с тегами "xs:minInclusive" и "xs:maxInclusive" берёте из свойства "value" необходимые вам значения ограничений.

READ ALSO
Раскрытие макросов

Раскрытие макросов

Есть маленький вопрос по раскрытиям макросов

191
Перенос кода из C++ в C (СИ)

Перенос кода из C++ в C (СИ)

Пытаюсь переписать этот код, написанный на C++ в C (СИ) Код делает следующее: читает str2 если находит * читает str1 от позиции * до ближайшей < потом...

223
Можно ли в Linux делать асинхронные вызовы одного и того-же сокета не защищая его?

Можно ли в Linux делать асинхронные вызовы одного и того-же сокета не защищая его?

Доброго времени сутокПишу клиент-серверное приложение на С++ под Linux

153