如何自定义和覆盖jaxb绑定

时间:2014-03-31 05:07:25

标签: java xml jaxb xsd

我正在使用来自第三方系统的一组DTD。我们的目标是将XML请求(符合这些DTD的请求映射到java中,然后将XML响应发送回系统)。

DTD是一成不变的(我没有任何控制权来改变它们)。

因此,为了映射,我使用XMLSpy将DTD转换为XML Schema(xsd),然后使用XJC编译器创建Jaxb绑定类。我使用的是Java 7.

问题是,DTD确实没有名称空间..我有20个不同的DTD .. 10个用于请求,10个用于响应。当我生成模式时,我不得不进行一对一的映射..并创建了相同的10个请求XSD和10个响应XSD。

现在,jaxb xjc编译器生成了绑定类..但它们远非实际用途。没有继承&#cus这些模式彼此无关(尽管它们似乎有类似的内容 - 请求类型和响应类型)。

如果有办法自定义jaxb绑定以覆盖默认绑定并创建更合理的绑定,有人可以帮助我吗?

例如,考虑这个简单的案例:

DTD:

<!ELEMENT FromDate (#PCDATA)>
<!ATTLIST FromDate
    year CDATA #REQUIRED
    month CDATA #REQUIRED
    day CDATA #REQUIRED
>

我使用XMLSpy生成的模式:

<xs:element name="FromDate">
    <xs:complexType mixed="true">
        <xs:attribute name="year" use="required"/>
        <xs:attribute name="month" use="required"/>
        <xs:attribute name="day" use="required"/>
    </xs:complexType>
</xs:element>

从XJC编译器生成的绑定类(java 1.7):

public class FromDate {

    @XmlValue
    protected String content;
    @XmlAttribute(name = "year", required = true)
    @XmlSchemaType(name = "anySimpleType")
    protected String year;
    @XmlAttribute(name = "month", required = true)
    @XmlSchemaType(name = "anySimpleType")
    protected String month;
    @XmlAttribute(name = "day", required = true)
    @XmlSchemaType(name = "anySimpleType")
    protected String day;
    ...
    ...

如果你看看fromDate最终是如何演变的,那么从这个请求中获取日期并没有任何意义,我需要这样做

setMyDate(request.getFromDate().getMonth() + request.getFromDate().getDay() + request.getFromDate().getYear());

这显然没有意义。此外,类型是远离。

如何自定义/覆盖jaxb绑定以实现以下两点: 1.继承(某种抽象以减少冗余) 2.适当的类型

请帮忙。

1 个答案:

答案 0 :(得分:1)

OMG有人试图在2014年编译DTD。:)

很少有链接:

作为另一种方法,我建议converting DTDs to schemas处理模式。长期会更好。 DTD支持非常有限