É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!
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...
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" />