2

私は JAXB を使用して、作成中のアプリケーションの XML を Java にバインドしています。amountmaxAmountという 2 つのamount要素を含むmeasureという要素があり、これを使用して下限値と上限値をモデル化します。amountmaxAmountはそれ以外は同一であり、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.AmountMeasure.MaxAmountは、名前を除いて同じですが、もちろん、Java に関する限り、互いにほとんど関係がありません。

amountmaxAmountの両方で JAXB に同じクラスを使用させる方法はありますか?

完全にクリーンになるために ;-) Trang を使用して RNC から XML スキーマを生成することを言及しておく必要があります。質問に対する答えが「XML スキーマを変更する」である場合、「その XML スキーマを生成するために RNC を変更するにはどうすればよいですか?」という補足的な質問があります。私の 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 の方が理解しやすいので RNC を使用しますが、私の問題の解決策が XML スキーマを使用することだけである場合は、それで構いません。

スティーブ

4

1 に答える 1

0

これは実際にはあなたの正確な質問に対する答えではないことはわかっていますが、属性グループが一般的なタイプを示している場合は、そのようにモデル化することを検討してください。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>

これは、同じタイプの amount と maxAmount の 2 つのフィールドにきれいにマップされます。

于 2011-01-08T22:47:34.650 に答える