控制JAXB为xsd:attributeGroup生成的类名?

时间:2010-10-14 19:53:59

标签: jaxb xsd xjc relaxng

我正在使用JAXB将XML绑定到Java以用于我正在编写的应用程序。我有一个名为 measure 的元素,其中包含两个名为 amount maxAmount amount 元素,我想用它们建模下限值和上限值。 amount maxAmount 在其他方面是相同的,我希望它们在解组到Java时使用相同的类实现。

以下是我提供给JAXB的XML模式的摘录:

<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为 amount maxAmount 使用相同的类?

刚刚完全清理;-)我应该提到我使用Trang从RNC生成XML模式。如果问题的答案是“更改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 Schema,那就这样吧。

史蒂夫

1 个答案:

答案 0 :(得分:0)

我知道这本身并不是您确切问题的答案,但如果属性组表示常见类型,请考虑对其进行建模吗?我不知道RNC是否可以这样做,但XML Schema可以:

<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。