Я использую JAXB для привязки XML к Java для приложения, которое я пишу. У меня есть элемент под названием мера который содержит два суммы элементов, называемых сумму и maxAmount, с которым требуется, чтобы смоделировать нижние и верхнюю предельную величину. сумма и maxAmount в противном случае идентичны, и я бы хотел, чтобы они были реализованы с тем же классом, когда они не были добавлены в Java.управление именами классов, сгенерированными JAXB для xsd: attributeGroup?
Ниже приводится выдержка из схемы 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-схемы?». Мой СРН выглядит следующим образом:
AmountAttributes =
QuantityAttribute?
& attribute numerator { xsd:nonNegativeInteger }?
& attribute denominator { xsd:positiveInteger }?
QuantityAttribute = attribute quantity { xsd:decimal }
Measure =
element measure {
element amount { AmountAttributes }?,
element maxAmount { AmountAttributes }?
}+
Я использую РСД, потому что я считаю, что проще понять, но если решение моей проблемы означает только с помощью XML-схемы, так и будет.
Стив
Спасибо за это. Похоже, я либо столкнулся с ограничением RNC, либо ограничением моих знаний о RNC. Полагаю, мне придется перейти на XSD. –
Я уверен, что вы можете обойти этот RNC <-> Несоответствие импеданса XSD, написав плагин компилятора схемы, но я боюсь, что это будет тяжелая борьба. Удачи с вашим проектом. – JesperSM