2012-03-30 26 views
34

Quiero saber la sintaxis correcta para definir un elemento que contenga tanto atributos como elementos secundarios (si es posible). Por ejemplo:Elemento XSD con atributos y elementos secundarios

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

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

Como puede ver, los componentes de ambos elementos, operación y evento tienen tanto atributos como elemento hijo. ¿Es posible definir esto en XSD? ¿Cómo?

¡Muchas gracias!

Respuesta

35

Esta es una forma posible de definir un XSD que coincida con su XML; Al aprender XSD, puede inscribir la ayuda de una herramienta que infiere el XSD por usted, comenzando con uno o más archivos de muestra 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> 

Como Tutorial esto, puede empezar a ajustar min/maxOccurs, el uso (requerido/opcional), las definiciones de reutilización, etc. A generado XSD es un buen punto de partida, pero normalmente termina siendo editado una manera o de otra ...

+24

Creo que es necesario que 'xsd: sequence' viene antes de' xsd: attribute's. –

+5

Sí, exactamente lo contrario de lo que cabría esperar, dado que en el xml real los atributos vienen antes que los elementos. –

+4

mala decisión de diseño de los diseñadores de esquemas XML, hace que el XSD sea más difícil de leer, además de ser contra intuitivo. Debería haber permitido poner atributo y secuencia, etc. en cualquier orden dentro del complexType –

3

estoy dando a continuación, una solución que funciona:

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

Cuestiones relacionadas