Контролировать имена классов, сгенерированные JAXB для xsd:attributeGroup?
Я использую JAXB для привязки XML к Java для приложения, которое я пишу. У меня есть элемент с именем measure, который содержит два элемента количества, называемых количеством и maxAmount, с помощью которых я хочу смоделировать нижнее и верхнее предельное значение. В остальном, сумма и maxAmount идентичны, и я хотел бы, чтобы они были реализованы с одним и тем же классом при демонтаже в Java.
Ниже приводится выдержка из схемы XML, которую я передаю в JAXB:
<xsd:attributeGroup name="AmountAttributes">
<xsd:attribute name="quantity" type="xsd:decimal"/>
<xsd:attribute name="numerator" type="xsd:nonNegativeInteger"/>
<xsd:attribute name="denominator" type="xsd:positiveInteger"/>
</xsd:attributeGroup>
<xsd:element name="measure">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="0" name="amount">
<xsd:complexType>
<xsd:attributeGroup ref="mpr:AmountAttributes"/>
</xsd:complexType>
</xsd:element>
<xsd:element minOccurs="0" name="maxAmount">
<xsd:complexType>
<xsd:attributeGroup ref="mpr:AmountAttributes"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
JAXB создает из этого более сложную версию следующего:
public class Measure {
protected Measure.Amount amount;
protected Measure.MaxAmount maxAmount;
public static class Measure.Amount {}
public static class Measure.MaxAmount {}
}
Measure.Amount и Measure.MaxAmount идентичны, за исключением их имен, но, разумеется, что касается Java, они имеют мало общего друг с другом.
Есть ли способ заставить JAXB использовать один и тот же класс для количества и maxAmount?
Просто чтобы быть полностью чистым;-) Я должен упомянуть, что я генерирую схему XML из RNC, используя Trang. Если ответ на вопрос "изменить схему XML", у меня возникает дополнительный вопрос "как изменить RNC для создания этой схемы XML?". Мой RNC выглядит так:
AmountAttributes =
QuantityAttribute?
& attribute numerator { xsd:nonNegativeInteger }?
& attribute denominator { xsd:positiveInteger }?
QuantityAttribute = attribute quantity { xsd:decimal }
Measure =
element measure {
element amount { AmountAttributes }?,
element maxAmount { AmountAttributes }?
}+
Я использую RNC, потому что нахожу это более простым для понимания, но если решение моей проблемы означает просто использование XML-схемы, пусть будет так.
Стив
1 ответ
Я знаю, что это не совсем ответ на ваш конкретный вопрос как таковой, но если группа атрибутов обозначает общий тип, подумайте о моделировании его как такового? Я не знаю, может ли RNC сделать это, но схема XML может:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/simple"
xmlns:tns="http://www.example.org/simple"
elementFormDefault="qualified">
<xsd:complexType name="AmountAttribute">
<xsd:attribute name="quantity" type="xsd:decimal" />
<xsd:attribute name="numerator" type="xsd:nonNegativeInteger" />
<xsd:attribute name="denominator" type="xsd:positiveInteger" />
</xsd:complexType>
<xsd:element name="measure">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="0" name="amount" type="tns:AmountAttribute"/>
<xsd:element minOccurs="0" name="maxAmount" type="tns:AmountAttribute"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Это четко отображает два поля количества и maxAmount одного типа.