Привет, я столкнулся с тем же требованием, за исключением того, что сконцентрировался на компактном синтаксисе. Вот один из способов сделать то, что вы хотите, но YMMV.
Чтобы дать некоторый контекст, моя цель состоит из двух этапов: (a) Попытка вырвать компактный синтаксис RelaxNG и пройти по объекту / дереву для создания 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 eh, String наследуемые Ns)
Когда вы вызываете CompactParseable.parse, вы получаете структурированные события в интерфейсе посетителя, и я думаю, что этого достаточно для обхода схемы rng, и отсюда вы можете легко создать OM или дерево.
Но я не уверен, что это лучший подход. Может быть, я что-то пропустил, и на самом деле существует OM / Tree, созданный реализацией rngom (в моем случае CompactSyntax), который вы можете пройти, чтобы легче определить отношения родитель / потомок. Или, может быть, есть другие подходы к этому.
Во всяком случае, это один подход, который, кажется, работает для того, что я хочу. В основном на основе шаблонов посетителей, и поскольку интерфейсы были там, я решил использовать их. Может быть, это будет работать для вас. В итоге, я не смог найти OM / AST, который может быть реализован где-либо в пакетах реализации (nc, binary, digested).