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.
Что именно вы выражаете <xs:choice>
? xs:choice
объявляет дочерний элемент сложного типа, который может быть ExternalAddress
или же InternalAddress
, Но, судя по вашему коду Scala, вы можете пытаться выразить тип адреса, который может быть внешним или внутренним.
В этом случае расширение сложного типа - это путь. См. http://scalaxb.org/running-scalaxb для примера USAddress
простирающийся Address
, Это генерирует Addressable
черта, которая является супертипом для обоих Address
а также USAddress
,