2009-07-29 18 views
17

¿Es posible tener herencia múltiple en esquemas XML? En caso afirmativo, ¿cómo?Esquemas XML con herencia múltiple

Ejemplo

<xs:schema xmlns:xs="http://www.w3.org/2001/Schema" ....> 

<xs:complexType name="Account"> 
    <xs:sequence> 
    <xs:element name="balance" type="xs:decimal"/> 
    <xs:element name="accountNo" type="xs:string"/> 
    </xs:sequence> 
</xs:complexType> 

<xs:complexType name="CreditCardAccount"> 
    <xs:complexContent> 
    <xs:extension base="Account"> 
    <xs:sequence> 
     <xs:element name="expiryDate" type="xs:date"/> 
     <xs:element name="issuer" type="xs:string"/> 
     <xs:element name="type" type="xs:string" use="required"/> 
    </xs:sequence> 
    </xs:extension> 
    <xs:complexContent> 
</xs:complexType> 

</xs:schema> 

Mi pregunta es; ¿Es posible que CreditCardAccount herede de varios tipos en lugar de Account solamente?

Respuesta

0

Herencia múltiple de qué? Si te refieres a tipos, entonces no.

21

Algo que se asemeja a la herencia múltiple de alguna manera se puede administrar utilizando un grupo de modelos con nombre y grupos de atributos con nombre; si se parece a la herencia múltiple de la manera que desea es algo que solo usted puede ver.

Supongamos que tiene tipos complejos Cuenta (como se muestra arriba) y Cliente, y desea que el tipo complejo CreditCardAccount herede de cada uno de ellos. Como han señalado otros, no puede especificar dos tipos de base en una definición de tipo complejo. Pero puede empaquetar el modelo de contenido de los tipos de Cuenta y Cliente en grupos de modelos con nombre, y referirse al grupo nombrado apropiado de la definición de tipo.

<xs:group name="Account"> 
    <xs:sequence> 
    <xs:element name="balance" type="xs:decimal"/> 
    <xs:element name="accountNo" type="xs:string"/> 
    </xs:sequence> 
</xs:group> 

<xs:group name="Customer"> 
    <xs:sequence> 
    <xs:element name="custid" type="xs:int"/> 
    <xs:element name="street" type="xs:string"/> 
    <xs:element name="city" type="xs:string"/> 
    <xs:element name="phone" type="xs:string"/> 
    </xs:sequence> 
</xs:group> 

<xs:complexType name="Account"> 
    <xs:sequence> 
    <xs:group ref="Account"/> 
    </xs:sequence> 
</xs:complexType> 

<xs:complexType name="Customer"> 
    <xs:sequence> 
    <xs:group ref="Customer"/> 
    </xs:sequence> 
</xs:complexType> 

A continuación, se puede hacer referencia a ambos grupos con nombre de CreditCardAccount:

<xs:complexType name="CreditCardAccount"> 
    <xs:sequence> 
    <xs:group ref="Account"/> 
    <xs:group ref="Customer"/> 
    <xs:element name="expiryDate" type="xs:date"/> 
    <xs:element name="issuer" type="xs:string"/> 
    <xs:element name="type" type="xs:string"/> 
    </xs:sequence> 
</xs:complexType> 
validador

un XSD no va a considerar el Cliente tipos, cuenta, y CreditCardAccount como relata en este caso, que puede ser o no importar.

Por supuesto, un enfoque más sencillo sería el uso de elementos como paquetes de información, y definir los elementos de cuentas, el Cliente, y CreditCardAccount, con CreditCardAccount que contiene ( sorpresa) un elemento de la cuenta y un elemento de atención al cliente.

2

Otra estrategia es tener extensiones encadenadas.

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema targetNamespace="http://mycompany.com/contacts" 
      xmlns="http://mycompany.com/contacts" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:complexType name="HaveIdentifier"> 
     <xs:sequence> 
      <xs:element name="UUID" type="xs:string"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="HasAssociations"> 
     <xs:complexContent> 
      <xs:extension base="HaveIdentifier"> 
       <xs:sequence> 
        <xs:element name="Associations" type="xs:string" minOccurs="0" maxOccurs="unbounded"/> 
       </xs:sequence> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
    <xs:complexType name="Address"> 
     <xs:complexContent> 
      <xs:extension base="HaveIdentifier"> 
       <xs:sequence> 
        <xs:element name="Street" type="xs:string" minOccurs="0" maxOccurs="1"/> 
       </xs:sequence> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
    <xs:complexType name="Contact"> 
     <xs:complexContent> 
      <xs:extension base="HasAssociations"> 
       <xs:sequence> 
        <xs:element name="Name" type="xs:string" minOccurs="0" maxOccurs="1"/> 
        <xs:element name="Addresses" type="Address" minOccurs="0" maxOccurs="unbounded"/> 
       </xs:sequence> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
</xs:schema> 

Nótese, sin embargo, que no sería capaz de tener un tipo complejo que "HasAssociations", pero no "HaveIdentifier"