scalaxb и xsd: выбор

Использование 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 ответа

Решение

Вопрос был неправильно сформулирован. Здесь правильный вопрос и ответ:

 <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.

Что именно вы выражаете <xs:choice>? xs:choice объявляет дочерний элемент сложного типа, который может быть ExternalAddress или же InternalAddress, Но, судя по вашему коду Scala, вы можете пытаться выразить тип адреса, который может быть внешним или внутренним.

В этом случае расширение сложного типа - это путь. См. http://scalaxb.org/running-scalaxb для примера USAddress простирающийся Address, Это генерирует Addressable черта, которая является супертипом для обоих Address а также USAddress,

Другие вопросы по тегам