2

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

4

2 回答 2

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

于 2012-02-13T14:48:27.310 回答
1

你到底在表达<xs:choice>什么?xs:choice声明可以是ExternalAddress或的复杂类型的子元素InternalAddress。但是从您的 Scala 代码来看,您可能正在尝试表达一种可以是外部或内部的地址类型。

在这种情况下,复杂类型扩展是可行的方法。有关扩展的示例,请参见http://scalaxb.org/running-scalaxb。这会生成trait ,它们都是和的超类型。USAddressAddressAddressableAddressUSAddress

于 2012-02-10T18:36:54.030 回答