Сейчас я работаю над частью моего приложения, где мне нужно проанализировать схему Relax NG и воспроизвести правила в файле в объектах C ++. Я начну с примера кода, чтобы я мог объяснить лучше.
<!-- property.element --> <define name="property.element"> <element name="property"> <attribute name="type" /> <interleave> <zeroOrMore> <ref name="resource.class" /> </zeroOrMore> <ref name="literal.class" /> </interleave> </element> </define>
Я хочу создать объект, где я могу хранить информацию, такую как:
Затем я хочу отобразить все возможные элементы в моем графическом интерфейсе, где я могу добавить только допустимые (в терминах схемы Relax NG) элементы в древовидную структуру. Например, я могу добавить только resource.class или literal.class в свой property.element, каждый другой возможный элемент отображается в моем GUI серым, когда я выбрал узел property.element в GUI. Я использую Qt, поэтому загружаю схему в QDomDocument, чтобы получить доступ к дереву DOM.
Такой механизм должен быть универсальным, то есть независимо от того, как называются элементы или какова его структура. В своем черновике я создал простой класс, в который я поместил несколько членов, таких как: define_name, element_name, required_attributes, необязательный_attributes. В настоящее время я застрял, потому что я не знаю, как представлять правила в классе C ++. Если бы у меня был постоянный набор объектов, над которыми я работаю, я бы жестко запрограммировал каждый объект, но мой набор объектов, скорее всего, со временем сильно изменится. У кого-нибудь есть идеи?
Преобразуйте файл RNG в XSD с помощью TRANG, затем преобразуйте XSD в c ++ с использованием CodeSynthesis (XSD или XSDe). Существует множество примеров с XSDe, поэтому может быть один, демонстрирующий, как проверить ввод XML с правилами схемы.
http://www.thaiopensource.com/relaxng/trang.html
http://www.codesynthesis.com/products/xsde/
Других решений пока нет …