2012-02-10 1 views
2

Использование http://scalaxb.org/scalaxb и XSD: выбор

<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

ответ

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

+0

Что такое 'InternalAddress'? Я смущен тем, как вы строите его через 'InternalAddress (...)'. –

1

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

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

+0

XSD дано мне, я не могу изменить его. –

 Смежные вопросы

  • Нет связанных вопросов^_^