scalaxb and xsd:choice



使用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声明复杂类型的子元素,该子元素可以是ExternalAddressInternalAddress。但从您的Scala代码来看,您可能试图表达一个地址类型,它可以是外部的,也可以是内部的。

在这种情况下,可以采用复杂类型扩展。看见http://scalaxb.org/running-scalaxb以CCD_ 5扩展CCD_。这产生了CCD_ 7性状,该性状是AddressUSAddress的超型。

最新更新