Контролировать имена классов, сгенерированные 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 одного типа.

Другие вопросы по тегам