使用RNGOM从RelaxNG模式生成对象模型 - 如何开始?

时间:2011-09-30 08:17:55

标签: java xsd code-generation relaxng

我想用RelaxNG Schema生成一个对象模型。

因此我想使用RNGOM Object Model/Parser(主要是因为我找不到任何替代方案 - 尽管我甚至不关心解析器编写/生成的语言)。现在我从SVN检查了RNGOM source,我不知道如何使用RNGOM,因为那里没有关于用法的任何信息。

一个有用的提示如何从RNGOM开始 - 一个链接,示例或任何描述,使我不必阅读理解RNGOM的整个源代码 - 将被作为答案。 更好的是如何使用解析器从RNG文件生成对象模型的简单示例。

更多信息:

我想从以下RelaxNG Schema中生成Java类:
http://libvirt.org/git/?p=libvirt.git;a=tree;f=docs/schemas;hb=HEAD

我发现Glassfish的人正在使用rngom生成我需要的相同对象模型,但我还不知道他们是如何使用rngom的。

2 个答案:

答案 0 :(得分:3)

进行的方法可以是:

  1. 使用jing从Relax NG转换为XML Schema(see here
  2. 使用更常用的工具来生成类(例如JaxB)。

答案 1 :(得分:0)

嗨我遇到了大致相同的要求,除了我专注于Compact Syntax。除了YMMV,这是一种做你想做的事。

为了给出一些上下文,我的目标分为两个阶段:(a)尝试啜饮RelaxNG Compact语法并遍历一个对象/树,以创建可在Spring 4 Rest Controller中使用的Spring 4 POJO。 (b)从那里我想开发一个使用RNG Compact的请求验证器,并在Spring反序列化请求之前自动验证请求。基本上使用RelaxNG Compact Syntax构建JSON REST API开发作为设计/文档和JSON模式定义/验证。

对于第一个目标,我考虑用JJTree注释CompactSyntax,但我显然不熟悉JavaCC,所以我决定采用更加程序化的方法......

我用几种方法分析和测试了代码,以确定在二进制,消化和/或nc包中是否存在树实现,但我认为没有一个(om / tree)。

所以我最近的,实际成功的方法是构建二进制文件并扩展SchemaBuilderImpl,实现访问者接口,并使用long构造函数将我的自定义SchemaBuilderImpl传递给CompactSyntax:CompactSyntax(CompactParseable parseable,Reader r,String sourceUri,SchemaBuilder) sb,ErrorHandler eh,String inheritedNs)

当您调用CompactParseable.parse时,您将在访问者界面中获得结构化事件,我认为这足以遍历rng模式,您可以从此处轻松创建OM或树。

但我不确定这是最好的方法。也许我错过了一些东西,实际上有一个由rngom实现(在我的案例中为CompactSyntax)构建的OM / Tree,你可以遍历以更容易地确定父/子关系。或者也许还有其他方法。

无论如何,这是一种似乎适用于我想要的方法。主要是访客模式,因为接口在那里我决定使用它们。也许它会对你有用。最重要的是,我找不到可以在实现包中实现的OM / AST(nc,二进制,消化)。