2010-10-14 3 views
2

Я использую 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-схемы, так и будет.

Стив

ответ

0

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

+0

Спасибо за это. Похоже, я либо столкнулся с ограничением RNC, либо ограничением моих знаний о RNC. Полагаю, мне придется перейти на XSD. –

+0

Я уверен, что вы можете обойти этот RNC <-> Несоответствие импеданса XSD, написав плагин компилятора схемы, но я боюсь, что это будет тяжелая борьба. Удачи с вашим проектом. – JesperSM

Смежные вопросы