Генерация объектной модели из схемы 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 ответа

Чтобы продолжить, можно:

  1. используйте jing для преобразования из Relax NG в XML-схему ( см. здесь)
  2. использовать более распространенные инструменты для генерации классов (например, 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, бинарный, переваренный).

Другие вопросы по тегам