Генерация объектной модели из схемы RelaxNG с помощью RNGOM - как начать?
Я хочу создать объектную модель из схемы RelaxNG.
Поэтому я хочу использовать объектную модель / синтаксический анализатор RNGOM (главным образом потому, что я не смог найти никакой альтернативы - хотя мне даже не важен язык, на котором синтаксический анализатор написан / генерирует). Теперь, когда я проверил источник RNGOM из SVN, у меня нет ЛЮБОЙ идеи, как использовать RNGOM, так как нет никакой информации об использовании.
Полезный совет о том, как начать с RNGOM - ссылка, пример или любое описание, которое избавляет меня от необходимости понимать весь исходный код RNGOM, - будет присужден в качестве ответа. Еще лучше будет простой пример использования синтаксического анализатора для создания объектной модели из файла RNG.
Больше информации:
Я хочу сгенерировать классы Java из следующей схемы RelaxNG:
http://libvirt.org/git/?p=libvirt.git;a=tree;f=docs/schemas;hb=HEAD
Я узнал, что ребята из Glassfish используют rngom для создания той же объектной модели, которая мне нужна, но я пока не мог выяснить, как они используют rngom.
2 ответа
Чтобы продолжить, можно:
- используйте jing для преобразования из Relax NG в XML-схему ( см. здесь)
- использовать более распространенные инструменты для генерации классов (например, JaxB).
Привет я столкнулся в основном с тем же требованием, за исключением того, что я концентрируюсь на компактном синтаксисе. Вот один из способов делать то, что вы хотите, но YMMV.
Чтобы дать некоторый контекст, моя цель состоит из двух этапов: (a) Попытка отобрать RelaxNG Compact Syntax и пройти по объекту / дереву, чтобы создать POJO Spring 4, пригодные для использования в Spring 4 Rest Controller. (б) Оттуда я хочу разработать валидатор запроса, который использует RNG Compact и автоматически проверяет запрос, прежде чем Spring десериализует его. По сути, это поддержка разработки JSON REST API с использованием RelaxNG Compact Syntax как для разработки / документации, так и для определения / проверки схемы JSON.
Для первой цели я подумал о том, чтобы аннотировать CompactSyntax с помощью JJTree, но я не очень хорошо разбираюсь в JavaCC, поэтому я решил использовать более программный подход...
Я проанализировал и протестировал код несколькими способами, чтобы определить, была ли реализация дерева в двоичных, переваренных и / или nc-пакетах, но я не думаю, что есть одна (om / tree) как таковая.
Поэтому мой последний, действительно успешный подход, заключался в том, чтобы основываться на двоичном и расширять SchemaBuilderImpl, реализовывать интерфейс посетителя и передавать мой пользовательский SchemaBuilderImpl в CompactSyntax с использованием длинного конструктора: CompactSyntax(CompactParseable parseable, Reader r, String sourceUri, SchemaBuilder sb, ErrorHandler) эх, Строка унаследована)
Когда вы вызываете CompactParseable.parse, вы получаете структурированные события в интерфейсе посетителя, и я думаю, что этого достаточно для обхода схемы rng, и отсюда вы можете легко создать OM или дерево.
Но я не уверен, что это лучший подход. Возможно, я что-то пропустил, и на самом деле существует OM/Tree, созданный реализацией rngom (в моем случае CompactSyntax), который вы можете пройти, чтобы легче определить отношения родитель / потомок. Или, может быть, есть другие подходы к этому.
Во всяком случае, это один подход, который, кажется, работает для того, что я хочу. В основном это основано на шаблонах посетителей, и так как интерфейсы были там, я решил использовать их. Может быть, это будет работать для вас. В итоге, я не смог найти OM/AST, который можно обойти, реализованный где-либо в пакетах реализации (nc, бинарный, переваренный).