É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 component, operation et event ont à la fois des attributs et un élément enfant. Est-il possible de définir cela dans XSD? Comment?

, Merci beaucoup!

37
demandé sur Ste83 2012-03-30 20:10:26

2 réponses

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 infère le XSD pour vous, à partir d'un ou plusieurs exemples de fichiers 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 fur et à mesure, vous pouvez commencer à peaufiner min/maxOccurs, utiliser (obligatoire/facultatif), réutiliser les définitions, etc. Un XSD généré est un bon point de départ, mais finit généralement par être édité d'une manière ou d'une autre...

36
répondu Petru Gardea 2012-03-30 17:20:15

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
répondu Murthy KVM 2016-11-28 10:27:40