6

我想从一个 RelaxNG 模式中生成一个对象模型。

因此,我想使用RNGOM 对象模型/解析器(主要是因为我找不到任何替代方案 - 尽管我什至不关心解析器编写/生成的语言)。现在我从 SVN 查看了RNGOM 源代码,我不知道如何使用 RNGOM,因为没有任何关于使用的信息。

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

更多信息:

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

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

4

2 回答 2

3

一种方法可能是:

  1. 使用 jing 从 Relax NG 转换为 XML Schema(见这里
  2. 使用更常用的工具来生成类(例如 JaxB)。
于 2012-02-16T10:52:22.587 回答
0

嗨,除了我专注于紧凑语法之外,我遇到了几乎相同的要求。这是一种做你想做的事的方法,但 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。

于 2014-12-02T22:50:23.273 回答