2012-12-19 8 views
10

Sto creando un nuovo servizio dataexchange presso la mia azienda. Vorremmo estendere un oggetto esistente definito nel nostro file delle definizioni core.xsd. Ecco un esempio di cosa devo fare:Come eseguire l'override dell'elemento Xsd all'interno dell'elemento principale/esteso

<xs:complexType name="parentType"> 
    <xs:sequence> 
    <xs:element name="departmentName" type="core:DEPARTMENT_NAME" 
       minOccurs="0" maxOccurs="1" />  
    </xs:sequence> 
</xs:complexType> 

<xs:complexType name="childType"> 
    <xs:complexContent> 
    <xs:extension base="parentType"> 
     <xs:sequence> 
     <xs:element name="departmentName" 
        type="core:DEPARTMENT_NAME" 
        minOccurs="1" maxOccurs="1"/> 
     </xs:sequence> 
    </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 

Penso che questo abbia perfettamente senso. Voglio sovrascrivere l'elemento padre e renderlo necessario. Tuttavia, un file xml valido sarebbe questo. Dove ora c'è un nome di reparto extra !?

<childType> 
    <departmentName>HR</departmentName> 
    <departmentName>IT</departmentName> 
</childType> 

Come posso fare questo in modo che il file XML sarebbe diventato:

<childType> 
    <departmentName>IT</departmentName> 
</childType> 

Grazie, Craig

risposta

7

È necessario utilizzare restrizione al posto di estensione. Questo sarebbe uno schema completo valido per lo scenario che hai indicato (ho utilizzato genericamente spazi dei nomi per renderlo valido).

<?xml version="1.0" encoding="utf-8" ?> 
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) --> 
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:core="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="parentType"> 
     <xs:sequence> 
      <xs:element name="departmentName" type="core:DEPARTMENT_NAME" minOccurs="0"/> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="childType"> 
     <xs:complexContent> 
      <xs:restriction base="parentType"> 
       <xs:sequence> 
        <xs:element name="departmentName" type="core:DEPARTMENT_NAME"/> 
       </xs:sequence> 
      </xs:restriction> 
     </xs:complexContent> 
    </xs:complexType> 

    <xs:simpleType name="DEPARTMENT_NAME"> 
     <xs:restriction base="xs:string"/> 
    </xs:simpleType> 

    <xs:element name="childType" type="childType"/> 
</xs:schema> 
+0

Grazie Petru, questo è quello che stavo cercando. Domanda però: cosa succede se voglio ancora estendere parentType? Dire che voglio aggiungere alcuni campi mancanti al tipo che lo estende. Ho notato che puoi solo limitare o estendere, ma non entrambi per un parentty. Sperimenterò, ma devo quindi creare un tipo grandChild che estenda childType, che ha le restrizioni su parentType? Sembra eccessivamente verboso e macchinoso, non esiste una soluzione più pulita? – Craig

+1

Per poter costruire in cima al childType dovrai creare il grandchildType. Sono d'accordo che sembra complicato - manutenzione di xsd: restrizioni in particolare .. ma questo è XSD 1.0. Per quanto riguarda la qualifica "più pulita" ... È nei dettagli davvero, e l'occhio di chi guarda. Se questo è un nuovo design, sono sicuro che ci sono diversi modi per impaginare la tua gerarchia in modo tale da darti qualcosa di ragionevole ... Devi anche pensare in termini di XSD per codificare i binding ... –