XSD element with both attributes and child elements
67,383
Solution 1
This is one possible way to define an XSD matching your XML; when learning XSD, you could enroll the help of a tool that infers the XSD for you, starting from one or more XML sample files.
<?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>
As you walkthrough this, you may start tweaking min/maxOccurs, use (required/optional), reusing definitions, etc. A generated XSD is a good starting point, but typically ends up being edited one way or another...
Solution 2
I am giving below, a solution that works:
<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" />
Author by
Ste83
Updated on November 29, 2020Comments
-
Ste83 over 3 years
I want to know the correct syntax for defining an element containing both attributes and child elements (if possible). For example:
<component type="A" binding="B"> <operation name="X"> <input type="C" /> </operation> <event name="Y"> <output type="D" /> </event> </component>
As you can see, both elements component, operation and event have both attributes and child element. Is it possible to define this in XSD? How?
Thank you very much!
-
Amir Ali Akbari over 10 yearsI think its required that
xsd:sequence
comes beforexsd:attribute
s. -
Andrew Shepherd over 10 yearsYes, precisely the opposite of what you would expect, given that in the actual xml the attributes come before the elements.
-
George Birbilis almost 10 yearsbad design decision from XML Schema designers, make's the XSD harder to read, apart from being counter intuitive. Should have allowed to put attribute and sequence etc. in any order inside the complexType