Я работаю с набором DTD от сторонней системы. Наша цель - сопоставить XML-запрос (который соответствует этим DTD в java, а затем отправить ответ XML в систему).
DTD написаны на камне (у меня нет никакого контроля при их изменении).
Таким образом, для сопоставления я преобразовал DTD в XML-схемы (xsd) с помощью XMLSpy, а затем создал Jaxb привязки классов с помощью XJC-компилятора. Я использую Java 7.
Проблема в том, что DTD на самом деле не имеют пространства имен.. и у меня есть 20 разных DTD. 10 для запроса и 10 для ответа. Когда я генерировал схемы, мне приходилось делать одно-одно отображение.. и создавали те же 10 запросов XSD и 10 XSD ответов.
Теперь компилятор jaxb xjc генерирует связанные классы. Но они далеки от практического использования. Нет наследования, поскольку эти схемы не связаны друг с другом (хотя они, похоже, имеют одинаковый контент - типы запросов и типы ответов).
Может кто-то, пожалуйста, помогите мне, если есть способ настроить привязки 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, наконец, эволюционировали, не имеет никакого смысла "cus просто получить дату от этого запроса, мне нужно сделать
setMyDate(request.getFromDate().getMonth() + request.getFromDate().getDay() + request.getFromDate().getYear());
что, очевидно, не имеет смысла. Кроме того, типы уходят.
Как я могу настроить/переопределить привязки jaxb для достижения этих двух вещей: 1. наследование (некоторая абстракция для сокращения избыточности). 2. соответствующие типы
Пожалуйста помоги.
OMG пытается скомпилировать DTD в 2014 году. :)
Несколько ссылок для вас:
В качестве другого подхода я бы предложил преобразовать DTD в схемы схемы обработки. Будет лучше долгосрочный. Поддержка DTD довольно ограничена