我正在使用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,那就这样吧。
史蒂夫
答案 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。