контролировать имена классов, сгенерированные JAXB для xsd: attributeGroup? - PullRequest
2 голосов
/ 14 октября 2010

Я использую JAXB для привязки XML к Java для приложения, которое я пишу. У меня есть элемент с именем measure , который содержит два элемента amount с именами amount и maxAmount , с помощью которых я хочу смоделировать меньшее и верхнее предельное значение. amount и 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-схемы, пусть будет так.

Steve

1 Ответ

0 голосов
/ 09 января 2011

Я знаю, что это не совсем ответ на ваш точный вопрос как таковой, но если группа атрибутов обозначает общий тип, подумайте о моделировании его как такового?Я не знаю, может ли 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 одного типа.

...