如何强制模式编译类扩展特定类外模式 [英] how to force schema compiled classes to extend specific class outside schema

查看:176
本文介绍了如何强制模式编译类扩展特定类外模式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

需要帮助以下情况:
用户可以生成自己的数据结构,存储为以下JAXB-ready XSD源:

Need help with following situation: Users can generate their own data structures which are stored as JAXB-ready XSD sources like below:

<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="Group" type="Group"/>
  <xs:element name="Parameter" type="Parameter"/>

  <xs:complexType name="Group">
    <xs:sequence>
      <xs:element name="caption" type="xs:string" minOccurs="0"/>
      <xs:element name="parameters" type="Parameter" nillable="true" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="Parameter">
    <xs:sequence>
      <xs:element name="key" type="xs:string" minOccurs="0"/>
      <xs:element name="group" type="Group" minOccurs="0"/>
      <xs:element name="value" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

新的或修改的模式出现后,它会被Schema编译器自动解析,生成,打包到用户jar:

After new or modified schema appears it is automatically parsed by Schema compiler, java sources being generated, compiled and packaged into user jars:

  SchemaCompiler sc = XJC.createSchemaCompiler();
  // Input source for schema
  InputSource is = new InputSource(new StringInputStream(objectPackage.getObjectSchema()));
  // Parse
  sc.parseSchema(is);
  S2JJAXBModel model = sc.bind();
  // Generate source
  JCodeModel jCodeModel = model.generateCode(null, null);
  jCodeModel.build(packageSourceDirectory);
  // Compile and package 
  // ......

一切都确定,直到确定所有用户生成的类必须扩展一个特定的已知类,例如 UserRootObject

And everything was ok until it was decided that all user-generated classes must extend one specific known class, say UserRootObject:

package user.abc;
public class Group extends com.mycompany.xml.UserRootObject {
  //
}

package user.abc;
public class Parameter extends com.mycompany.xml.UserRootObject {
  //
}


b $ b

一切都在运行,我不能强制用户修改他们的模式文件,但我可以在代码生成之前转换它们。
看起来像我有两个选项介绍 UserRootObject :通过 JCodeModel 或以某种方式转换模式文件构建Java源代码。

Everything is on the fly, I can not force users to modify their schema files but I can transform them prior to code generation. Looks like I have two options to introduce that UserRootObject: somehow via JCodeModel or somehow transforming schema files before building Java sources.

推荐答案

我不相信有一个简单的方法来使用JAXB本身。有许多常用的自定义选项,请参阅 JSR222第7节< a>。

I do not believe that there is an easy way to do this using JAXB itself. There are a number of customization options available that are not commonly known - read section 7 of JSR222 for details.

如果您对输入模式有一些控制,那么您可能需要考虑使用XSLT来转换模式。我相信这可以通过使用 javax.xml.transform.dom.DOMResult 实例作为转换的目标,并使用输出作为DOM树(例如,在结果中调用 getNode()作为 parseSchema 的输入。一个基本的转换是替换:

If you have some control over the input schemas, then you might want to consider using XSLT to transform the schema. I believe that this can be done by using a javax.xml.transform.dom.DOMResult instance as the target of the transformation and using the output as a DOM tree (e.g., calling getNode() on the result) as the input to parseSchema. A basic transformation would be to replace:

<xs:complexType name="foo">
  <!-- CONTENTS -->
</xs:complexType>

具有类似:

<xs:complexType name="foo">
  <xs:complexContent>
    <xs:extension base="UserRootObject">
      <!-- CONTENTS -->
    </xs:extension>
  </xs:complexContent>
</xs:complexType>

当然,这只适用于简单的情况。如果您已经在架构文件中具有继承,那么您将必须在XSLT中进行一些过滤,只将此转换应用于尚未扩展的类型。

Of course this only works for the simple cases. If you already have inheritance in your schema files, then you will have to do some filtering in the XSLT that only applies this transform to types that do not already extend.

这篇关于如何强制模式编译类扩展特定类外模式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆