2009-07-29 15 views
17

Czy jest możliwe posiadanie dziedziczenia wielokrotnego w schematach XML, jeśli tak, w jaki sposób?Schematy XML z dziedziczeniem wielokrotnym

Przykład

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

pytanie jest; Czy konto CreditCard może dziedziczyć z wielu typów zamiast tylko konta?

Odpowiedz

0

Wielokrotne dziedziczenie czego? Jeśli masz na myśli typy, to nie.

21

Coś, co przypomina kilka dziedziczenie na kilka sposobów, może być zarządzane przy użyciu nazwanej grupy modeli i nazwanych grup atrybutów; to, czy przypomina wiele dziedziczenia w sposób, w jaki chcesz, to coś, co tylko Ty możesz powiedzieć.

Załóżmy, że masz konta typu złożonego (jak pokazano powyżej) i klienta, i chcesz, aby typ złożony CreditCardAccount dziedziczył po każdym z nich. Jak wskazali inni, nie można określić dwóch typów podstawowych w definicji typu złożonego. Można jednak spakować model zawartości Konta i typy klientów do nazwanych grup modeli i odnieść się do odpowiedniej nazwanej grupy z definicji typu.

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

Następnie można zwrócić się do obu wymienionych grup od 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> 

XSD walidator nie uzna Klienta typów kont, a CreditCardAccount jako związane w tym przypadku, co może lub nie może materia.

oczywiście prostsze podejście byłoby użyć elementy jak pakiety informacji i zdefiniować elementy konto, klient, i CreditCardAccount z CreditCardAccount zawierającej (niespodzianka) element rachunku i elementu Klienta.

2

Inną strategią jest posiadanie rozszerzonych łańcuchów.

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

Należy jednak pamiętać, że nie będzie mogła mieć typ złożony, że „HasAssociations”, ale nie „HaveIdentifier”

Powiązane problemy