我正在使用来自第三方系统的一组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.适当的类型
请帮忙。
答案 0 :(得分:1)
OMG有人试图在2014年编译DTD。:)
很少有链接:
作为另一种方法,我建议converting DTDs to schemas处理模式。长期会更好。 DTD支持非常有限