scalaxb和xsd:选择

时间:2012-02-10 16:56:31

标签: scala scalaxb

使用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

2 个答案:

答案 0 :(得分:3)

这个问题制定错误。 这是正确的问题和答案:

 <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

答案 1 :(得分:1)

您对<xs:choice>的具体表述是什么? xs:choice声明复杂类型的子元素,可以是ExternalAddressInternalAddress。但是从Scala代码判断,您可能会尝试表达可能是外部或内部的地址类型。

在这种情况下,复杂的类型扩展是要走的路。有关USAddress扩展Address的示例,请参阅http://scalaxb.org/running-scalaxb。这会生成Addressable个特征,这些特征是AddressUSAddress的超类型。