scalaxb и xsd: выбор - PullRequest
       33

scalaxb и xsd: выбор

2 голосов
/ 10 февраля 2012

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

3 голосов
/ 13 февраля 2012

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

 <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 голос
/ 10 февраля 2012

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

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

...