web-dev-qa-db-fra.com

Élément XSD avec des attributs et des éléments enfants

Je veux connaître la syntaxe correcte pour définir un élément contenant à la fois des attributs et des éléments enfants (si possible). Par exemple:

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

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

Comme vous pouvez le voir, les deux éléments composant, opération et événement ont à la fois des attributs et un élément enfant. Est-il possible de définir cela en XSD? Comment?

Merci beaucoup!

41
Ste83

C'est une façon possible de définir un XSD correspondant à votre XML; lors de l'apprentissage de XSD, vous pouvez inscrire l'aide d'un outil qui déduit le XSD pour vous, à partir d'un ou plusieurs fichiers d'exemple 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>

Au cours de cette procédure, vous pouvez commencer à peaufiner min/maxOccurs, utiliser (requis/facultatif), réutiliser des définitions, etc. Un XSD généré est un bon point de départ, mais finit généralement par être modifié d'une manière ou d'une autre ...

46
Petru Gardea

Je donne ci-dessous, une solution qui fonctionne:

<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" />
4
Murthy KVM