生成POJO当JAXB使用元素名称代替类型

问题描述 投票:0回答:1

使用JAXB我想生成XSD的POJO。但XSD由外部供应商,其中元素有meaninful名提供的,但类型是怪异。只是一个例子:

<xs:element name="PersonAddress" type="PerAdr" />

<xs:complexType name="PerAdr">
    <xs:sequence>
        <xs:element name="street" type="xs:string" minOccurs="1" maxOccurs="unbounded" />
        <xs:element name="house" type="xs:string" minOccurs="1" maxOccurs="unbounded" />
    </xs:sequence>
</xs:complexType>

所以生成的类被称为PerAdr。如何使它产生类,他们的名字是元素名称,而不是类型,因此它会在这种情况下,类PersonAddress产生。

我有一个巨大的XSD,所以想这样做,不只是写数百行的.xjb文件的一个聪明的办法

spring xsd jaxb pojo
1个回答
0
投票

我不是JAXB完全是一个专业。但是,我已经看了JAXB规范(这里:http://download.oracle.com/otn-pub/jcp/jaxb-2.0-fr-oth-JSpec/jaxb-2_0-fr-spec.pdf),发现如下:


模式派生Element类的特性衍生的“元素声明架构组件”的性能方面349页,如下所示:

  • 生成的Java类元素的名称是从使用XML名称对类名Java标识符映射算法元素声明{名称}的。
  • 每个生成的元素类必须扩展Java值类javax.xml.bind.JAXBElement<T>。接下来的子弹指定模式派生Java类名来使用泛型参数T
  • 如果元素声明{类型定义}为 匿名:如在6.7.3节规定的从第二子弹通用参数T设定为模式派生类表示产生的匿名类型定义。 命名为:从第二子弹泛型参数T设定为代表元素声明{类型定义}的Java类。

因此,人们可以从结论是:一旦你有一个名为XSD类型的XSD元素,你就必须处理表示类型的Java类和后命名。这是符合逻辑的。毕竟,你可能有相同的全局类型不同的XSD元素。这是默认的映射。

然而,JAXB允许自定义(的XML模式),通过它可以覆盖某些事情。例如,你可以修改由XSD类型,e.g生成的Java类的名称:

<xs:complexType name="USAddress">
  <xs:annotation> <xs:appinfo>
    <jaxb:class name="MyAddress" />
  </xs:appinfo></xs:annotation>
  <xs:sequence>...</xs:sequence>
  <xs:attribute name="country" type="xs:string"/>
</xs:complexType>

所以,与其USAddress,结果Java类将被命名为MyAddress。这看起来像一个解决问题的方法,而是要利用它,你将需要修改每一种类型定义你的XSD,因为你的模式是巨大听起来令人生畏。

所以,你可以做什么?

首先,你需要确保你的模式和它的(全局定义)的每个XSD元素类型唯一相互对应。如果碰巧是几个不同的XSD元素与同类型,很明显的类型名称不能等于所有的人。在这种情况下,如果你不喜欢原来的类型名称,你只需要手动编辑模式,并给这些类型不同的名称,因为它更好地满足你。

任何自动化是可能的,只有当关系XSD元素< - >其XSD类型是独一无二的!在这种情况下,你可以得到从元素名称的类型名称:让它相同或增加,例如,T前缀:TPersonAddress

这通常被称为重构和可自动完成。现在的问题是怎么了?

那么,既然是XSD XML,你可以写一个XSLT脚本,做必要的改造。但是,这可没那么简单,因为你将不得不解析模式的位。也就是说,在那里认识的每个XSD元素,并找到相应的XSD类型,然后在两个位置更改类型名称。可替代地,可以插入每个XSD类型的定义中的那些定制指令(<jaxb:...>元素),如上所述。我不知道会是多少拿这样的事情编程。这肯定会归结为创建一个索引(与<xsl:key>结构),并通过迭代它。


或者,我可以建议你一些非正统的方法。我们已经开发了一种名为FlexDoc/XML工具。从本质上讲,它是XML文件转换成任何东西。变换是使用一些模板的工作方式与XSLT编程。

最初的想法是到XSLT样的方式扩展到任何种类的通过各种API提供的基于Java的数据源。例如,我们有一个名为FlexDoc/Javadoc模仿标准的Javadoc类似的产品。但后来我们意识到XML本身也是一个很好的领域充满了各种繁重工作任务,其中XSLT是太轻。例如,通过数以百计的XSD和WSDL文件,我们现在有两个模板集的生成易于导航的单一文件:XSDDocWSDLDoc。 (我们正在为JSON架构类似的事情还在努力)。

使用FlexDoc/XML就可以创建一个模板,做你所需要的(重命名的XSD类型)。可以在一个小时内就可以完成,我们会为你做它,如果你购买最终形成“FlexDoc / XML SDK”许可证。 (人们通常买的SDK许可定制XSDDoc / WSDLDoc模板,但它同样可作为像您这样的任务的单独的工具。)

© www.soinside.com 2019 - 2024. All rights reserved.