嗨,除了我专注于紧凑语法之外,我遇到了几乎相同的要求。这是一种做你想做的事的方法,但 YMMV。
为了提供一些背景信息,我的目标分为两个阶段: (a) 尝试使用 RelaxNG Compact Syntax 并遍历对象/树以创建可在 Spring 4 Rest Controller 中使用的 Spring 4 POJO。(b) 从那里我想开发一个使用 RNG Compact 的请求验证器,并在 Spring 反序列化请求之前自动验证请求。基本上使用 RelaxNG Compact Syntax 作为设计/文档和 JSON 模式定义/验证来构建 JSON REST API 开发。
对于第一个目标,我考虑过用 JJTree 注释 CompactSyntax,但我显然不熟悉 JavaCC,所以我决定采用更加程序化的方法......
我以多种方式分析和测试了代码,以确定二进制、摘要和/或 nc 包中是否存在树实现,但我认为没有这样的(om/tree)。
所以我最新的,实际上成功的方法是构建二进制并扩展 SchemaBuilderImpl,实现访问者界面,并使用长构造函数将我的自定义 SchemaBuilderImpl 传递给 CompactSyntax:CompactSyntax(CompactParseable parseable, Reader r, String sourceUri, SchemaBuilder sb, ErrorHandler嗯,字符串继承Ns)
当您调用 CompactParseable.parse 时,您将在访问者界面中获得结构化事件,我认为这足以遍历 rng 模式,并且您可以从这里轻松创建 OM 或树。
但我不确定这是最好的方法。也许我错过了一些东西,实际上有一个由 rngom 实现(在我的例子中是 CompactSyntax)构建的 OM/Tree,您可以遍历它来更轻松地确定父/子关系。或者也许还有其他方法可以解决这个问题。
无论如何,这是一种似乎适用于我想要的方法。主要是基于访问者模式的,由于接口在那里,我决定使用它们。也许它会为你工作。最重要的是,我找不到可以在实现包(nc、二进制、摘要)中的任何地方实现的 OM/AST。