2012-03-30 23 views
34

Desidero conoscere la sintassi corretta per la definizione di un elemento contenente sia attributi che elementi figlio (se possibile). Per esempio:Elemento XSD con entrambi gli attributi e gli elementi figlio

<component type="A" binding="B"> 
    <operation name="X"> 
    <input type="C" /> 
    </operation> 

    <event name="Y"> 
    <output type="D" /> 
    </event> 
</component> 

Come si può vedere, entrambi elementi che lo compongono, il funzionamento e degli eventi hanno sia attributi e elemento figlio. È possibile definire questo in XSD? Come?

Grazie mille!

risposta

35

Questo è un modo possibile per definire un XSD che corrisponde al tuo XML; durante l'apprendimento di XSD, è possibile registrare l'aiuto di uno strumento che deduce l'XSD per te, a partire da uno o più file di esempio XML.

<?xml version="1.0" encoding="utf-8"?> 
<!--W3C Schema generated by QTAssistant/W3C Schema Refactoring Module (http://www.paschidev.com)--> 
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name="component"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="operation"> 
      <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="input"> 
       <xsd:complexType> 
        <xsd:attribute name="type" type="xsd:string" use="required" /> 
       </xsd:complexType> 
       </xsd:element> 
      </xsd:sequence> 
      <xsd:attribute name="name" type="xsd:string" use="required" /> 
      </xsd:complexType> 
     </xsd:element> 
     <xsd:element name="event"> 
      <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="output"> 
       <xsd:complexType> 
        <xsd:attribute name="type" type="xsd:string" use="required" /> 
       </xsd:complexType> 
       </xsd:element> 
      </xsd:sequence> 
      <xsd:attribute name="name" type="xsd:string" use="required" /> 
      </xsd:complexType> 
     </xsd:element> 
     </xsd:sequence> 
     <xsd:attribute name="type" type="xsd:string" use="required" /> 
     <xsd:attribute name="binding" type="xsd:string" use="required" /> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

Come si walkthrough questo, si può iniziare a modificare min/maxOccurs, l'uso (richiesto/opzionale), le definizioni riutilizzo, ecc Un generato XSD è un buon punto di partenza, ma in genere finisce per essere modificato in un modo o altro ...

+24

credo che la sua richiesta che 'xsd: sequence' viene prima' xsd: attribute's. –

+5

Sì, esattamente il contrario di ciò che ci si aspetterebbe, dato che nell'attuale xml gli attributi vengono prima degli elementi. –

+4

Decisione di progettazione errata da parte dei progettisti XML Schema, rende l'XSD più difficile da leggere, oltre a essere contro-intuitivo. Dovrebbe avere permesso di mettere attributi e sequenze ecc. In qualsiasi ordine all'interno di complexType –

3

sto dando seguito, una soluzione che funziona:

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

<xs:complexType name="inputType"> 
    <xs:attribute name="type" type="inputTypeType"/>    
</xs:complexType> 

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

<xs:complexType name="operationType"> 
    <xs:sequence> 
    <xs:element name="input" type="inputType" /> 
    </xs:sequence> 
    <xs:attribute name="name" type="operationNameType"/> 
</xs:complexType> 



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

<xs:complexType name="outputType"> 
    <xs:attribute name="type" type="outputTypeType"/>   
</xs:complexType> 

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

<xs:complexType name="eventType"> 
    <xs:sequence> 
    <xs:element name="output" type="outputType" /> 
    </xs:sequence> 
    <xs:attribute name="name" type="eventNameType"/> 
</xs:complexType> 


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

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




<xs:complexType name="componentType"> 
    <xs:sequence>   
     <xs:element name="operation" type="operationType" /> 
     <xs:element name="event" type="eventType" /> 
    </xs:sequence> 
    <xs:attribute name="type" type="typeType"/> 
    <xs:attribute name="binding" type="bindingType"/>  
</xs:complexType> 


<xs:element name="component" type="componentType" /> 

Problemi correlati