使用http://scalaxb.org/
<xsd:complexType name="Address">
<xsd:choice>
<xsd:element ref="ExternalAddress" />
<xsd:element ref="InternalAddress" />
</xsd:choice>
</xsd:complexType>
val internalAddrress = InternalAddress(...); // this works.
val address : Address = internalAddrress; // error: type mismatch
我需要如何修改此代码才能使其工作?
这里有一些信息,我玩过DataRecord和其他游戏,但我没有成功。http://scalaxb.org/narrower-choice
这个问题的表述不正确。这里是正确的问题和答案:
<xsd:complexType name="Address">
<xsd:choice>
<xsd:element name="externalAddress" type="ExternalAddress" />
<xsd:element name="internalAddress" type="InternalAddress" />
</xsd:choice>
</xsd:complexType>
val internalAddress = InternalAddress(...); // this works.
val address = Address(scalaxb.DataRecord(None, Some("internalAddress"), internalAddress)); // now this works.
请参阅https://github.com/eed3si9n/scalaxb/issues/138#issuecomment-3943088
您用<xs:choice>
到底表达了什么?xs:choice
声明复杂类型的子元素,该子元素可以是ExternalAddress
或InternalAddress
。但从您的Scala代码来看,您可能试图表达一个地址类型,它可以是外部的,也可以是内部的。
在这种情况下,可以采用复杂类型扩展。看见http://scalaxb.org/running-scalaxb以CCD_ 5扩展CCD_。这产生了CCD_ 7性状,该性状是Address
和USAddress
的超型。