View
219
Download
0
Category
Preview:
Citation preview
XML SchemaXML Schema
Why Validate XML?Why Validate XML?
• XML documents can generally have any structure
• XML grammars define specific document structures
• Validation is the act of checking an XML document against a DTD or XML schema defined for a grammar
• XML documents can generally have any structure
• XML grammars define specific document structures
• Validation is the act of checking an XML document against a DTD or XML schema defined for a grammar
XSDXSD
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://tempuri.org/example"
xmlns:ex="http://tempuri.org/example">
…schema definitions go here…
</schema>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://tempuri.org/example"
xmlns:ex="http://tempuri.org/example">
…schema definitions go here…
</schema>
What Are Built-In Datatypes?
What Are Built-In Datatypes?
• W3C XML schemas define many built-in datatypes
• Built-in datatypes can be primitive or derived
• Examples: integer,long,short…
• W3C XML schemas define many built-in datatypes
• Built-in datatypes can be primitive or derived
• Examples: integer,long,short…
Element DeclarationsElement Declarations
<xs:element name="elementname" type="datatype“
(fixed="fixedvalue" | default="defaultvalue")minOccurs="value" maxOccurs="value" … />
<xs:element name="author" type="xs:string"maxOccurs="unbounded" /><xs:element name="pages" type="xs:integer" /><xs:element name="published" type="xs:date"
minOccurs="0" />
<xs:element name="elementname" type="datatype“
(fixed="fixedvalue" | default="defaultvalue")minOccurs="value" maxOccurs="value" … />
<xs:element name="author" type="xs:string"maxOccurs="unbounded" /><xs:element name="pages" type="xs:integer" /><xs:element name="published" type="xs:date"
minOccurs="0" />
Attribute DeclarationsAttribute Declarations
<xs:attribute name="attributename" type="datatype"
(fixed="fixedvalue" | default="defaultvalue")use= ("optional" | "prohibited" | "required") … />
<xs:attribute name="isbn" type="xs:string" use="required" />
<xs:attribute name="attributename" type="datatype"
(fixed="fixedvalue" | default="defaultvalue")use= ("optional" | "prohibited" | "required") … />
<xs:attribute name="isbn" type="xs:string" use="required" />
Derive New Simple TypesDerive New Simple Types
<xs:simpleType name="customerID">
<xs:restriction base="xs:string">
<xs:length value="5" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="customerID">
<xs:restriction base="xs:string">
<xs:length value="5" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="numberOfMonths"><xs:restriction base="xs:byte">
<xs:minInclusive value="1" /><xs:maxInclusive value="12" />
</xs:restriction></xs:simpleType>
<xs:simpleType name="size"><xs:restriction base="xs:string">
<xs:enumeration value="small" /><xs:enumeration value="large" />
</xs:restriction></xs:simpleType>
<xs:simpleType name="timestamp"><xs:union memberTypes="xs:dateTime xs:long" />
</xs:simpleType>
<xs:simpleType name="numberOfMonths"><xs:restriction base="xs:byte">
<xs:minInclusive value="1" /><xs:maxInclusive value="12" />
</xs:restriction></xs:simpleType>
<xs:simpleType name="size"><xs:restriction base="xs:string">
<xs:enumeration value="small" /><xs:enumeration value="large" />
</xs:restriction></xs:simpleType>
<xs:simpleType name="timestamp"><xs:union memberTypes="xs:dateTime xs:long" />
</xs:simpleType>
<xs:simpleType name="licensePlate"><xs:restriction base="xs:string">
<xs:pattern value="[A-Z]{3}-\d{3}" /></xs:restriction>
</xs:simpleType>
<xs:simpleType name="listOfCustomers"><xs:restriction>
<xs:simpleType><xs:list>
<xs:simpleType><xs:restriction base="xs:string">
<xs:length value="5" /></xs:restriction>
</xs:simpleType></xs:list>
</xs:simpleType><xs:length value="3" />
</xs:restriction></xs:simpleType>
<xs:simpleType name="licensePlate"><xs:restriction base="xs:string">
<xs:pattern value="[A-Z]{3}-\d{3}" /></xs:restriction>
</xs:simpleType>
<xs:simpleType name="listOfCustomers"><xs:restriction>
<xs:simpleType><xs:list>
<xs:simpleType><xs:restriction base="xs:string">
<xs:length value="5" /></xs:restriction>
</xs:simpleType></xs:list>
</xs:simpleType><xs:length value="3" />
</xs:restriction></xs:simpleType>
How to Reference Simple TypesHow to Reference Simple Types
<xs:element name="listOfCustomers">
<xs:simpleType>
<xs:list itemType="xs:string" />
</xs:simpleType>
<xs:element>
<xs:element name="listOfCustomers">
<xs:simpleType>
<xs:list itemType="xs:string" />
</xs:simpleType>
<xs:element>
<xs:attribute name="oldPlate"><xs:simpleType>
<xs:restriction base="xs:string"><xs:pattern value="[A-Z]{3}-\d{3}" />
</xs:restriction></xs:simpleType>
</xs:attribute><xs:attribute name="newPlate">
<xs:simpleType><xs:restriction base="xs:string">
<xs:pattern value="[A-Z]{3}-\d{3}" /></xs:restriction>
</xs:simpleType></xs:attribute>
<xs:attribute name="oldPlate"><xs:simpleType>
<xs:restriction base="xs:string"><xs:pattern value="[A-Z]{3}-\d{3}" />
</xs:restriction></xs:simpleType>
</xs:attribute><xs:attribute name="newPlate">
<xs:simpleType><xs:restriction base="xs:string">
<xs:pattern value="[A-Z]{3}-\d{3}" /></xs:restriction>
</xs:simpleType></xs:attribute>
Better ideaBetter idea
<xs:attribute name="oldPlate" type="licensePlate" />
<xs:attribute name="newPlate" type="licensePlate" />
<xs:simpleType name="licensePlate">
<xs:restriction base="xs:string">
<xs:pattern value="[A-Z]{3}-\d{3}" />
</xs:restriction>
</xs:simpleType>
<xs:attribute name="oldPlate" type="licensePlate" />
<xs:attribute name="newPlate" type="licensePlate" />
<xs:simpleType name="licensePlate">
<xs:restriction base="xs:string">
<xs:pattern value="[A-Z]{3}-\d{3}" />
</xs:restriction>
</xs:simpleType>
Complex DatatypesComplex Datatypes
<xs:element name="book"><xs:complexType>
<xs:sequence><xs:element name="title" type="xs:string" /><xs:element name="isbn" type="xs:string" /><xs:element name="publisher" type="xs:string"
/></xs:sequence>
</xs:complexType></xs:element>
<xs:element name="book"><xs:complexType>
<xs:sequence><xs:element name="title" type="xs:string" /><xs:element name="isbn" type="xs:string" /><xs:element name="publisher" type="xs:string"
/></xs:sequence>
</xs:complexType></xs:element>
Explicit complex type for reuseExplicit complex type for reuse
<xs:complexType name="booktype"><xs:sequence>
<xs:element name="title" type="xs:string" /><xs:element name="isbn" type="xs:string" /><xs:element name="publisher" type="xs:string" />
</xs:sequence></xs:complexType>
<xs:element name="book" type="booktype" />
<xs:complexType name="booktype"><xs:sequence>
<xs:element name="title" type="xs:string" /><xs:element name="isbn" type="xs:string" /><xs:element name="publisher" type="xs:string" />
</xs:sequence></xs:complexType>
<xs:element name="book" type="booktype" />
• Element that can only contain one of a predefined set
<xs:element name="contactmethod">
<xs:complexType>
<xs:choice>
<xs:element name="tel" type="xs:string" />
<xs:element name="email" type="xs:string" />
<xs:element name="fax" type="xs:string" />
</xs:choice>
</xs:complexType>
</xs:element>
• Element that can only contain one of a predefined set
<xs:element name="contactmethod">
<xs:complexType>
<xs:choice>
<xs:element name="tel" type="xs:string" />
<xs:element name="email" type="xs:string" />
<xs:element name="fax" type="xs:string" />
</xs:choice>
</xs:complexType>
</xs:element>
• Elements that contain optional child elements in any order
<xs:element name="contactinfo"><xs:complexType>
<xs:all><xs:element name="telephone" type="xs:string" /><xs:element name="fax" type="xs:string" /><xs:element name="email" type="xs:string" /><xs:element name="pager" type="xs:string" />
</xs:all></xs:complexType>
</xs:element>
• Elements that contain optional child elements in any order
<xs:element name="contactinfo"><xs:complexType>
<xs:all><xs:element name="telephone" type="xs:string" /><xs:element name="fax" type="xs:string" /><xs:element name="email" type="xs:string" /><xs:element name="pager" type="xs:string" />
</xs:all></xs:complexType>
</xs:element>
Complex Datatypes with Attributes
Complex Datatypes with Attributes
<xs:element name="employee"><xs:complexType>
<xs:sequence><xs:element name="name" type="xs:string" /><xs:element name="title" type="xs:string" /><xs:element name="salary" type="xs:integer" />
</xs:sequence><xs:attribute name="email" type="xs:string" /><xs:attribute name="department" type="xs:string" />
<xs:complexType></xs:element>
<xs:element name="employee"><xs:complexType>
<xs:sequence><xs:element name="name" type="xs:string" /><xs:element name="title" type="xs:string" /><xs:element name="salary" type="xs:integer" />
</xs:sequence><xs:attribute name="email" type="xs:string" /><xs:attribute name="department" type="xs:string" />
<xs:complexType></xs:element>
Extend the base content by adding an attribute
Extend the base content by adding an attribute
<xs:element name="Length"><xs:complexType>
<xs:simpleContent><xs:extension base="xs:decimal">
<xs:attribute name="Units" type="xs:string" />
</xs:extension></xs:simpleContent>
</xs:complexType></xs:element>
<Length Units="Feet">12.75</Length>
<xs:element name="Length"><xs:complexType>
<xs:simpleContent><xs:extension base="xs:decimal">
<xs:attribute name="Units" type="xs:string" />
</xs:extension></xs:simpleContent>
</xs:complexType></xs:element>
<Length Units="Feet">12.75</Length>
How to Reference Existing Declarations
How to Reference Existing Declarations
<xs:element name="email"><xs:simpleType>
<xs:restriction base="xs:string"><xs:pattern value="[a-zA-Z0-9]+@[a-zA-Z0-9]+" />
</xs:restriction></xs:simpleType>
</xs:element><xs:attribute name="title" type="xs:string" /><xs:element name="employee">
<xs:complexType><xs:sequence>
<xs:element name="name" type="xs:string" /><xs:element ref="email" />
</xs:sequence><xs:attribute ref="title" use="required" />
</xs:complexType></xs:element>
<xs:element name="email"><xs:simpleType>
<xs:restriction base="xs:string"><xs:pattern value="[a-zA-Z0-9]+@[a-zA-Z0-9]+" />
</xs:restriction></xs:simpleType>
</xs:element><xs:attribute name="title" type="xs:string" /><xs:element name="employee">
<xs:complexType><xs:sequence>
<xs:element name="name" type="xs:string" /><xs:element ref="email" />
</xs:sequence><xs:attribute ref="title" use="required" />
</xs:complexType></xs:element>
<xs:element name="contactMethod"><xs:complexType>
<xs:choice><xs:element name="telephone">
<xs:simpleType><xs:restriction base="xs:string">
<xs:pattern value="(\d+|\s*)+" />
</xs:restriction></xs:simpleType>
</xs:element><xs:element ref="email" />
</xs:choice></xs:complexType>
</xs:element>
<xs:element name="contactMethod"><xs:complexType>
<xs:choice><xs:element name="telephone">
<xs:simpleType><xs:restriction base="xs:string">
<xs:pattern value="(\d+|\s*)+" />
</xs:restriction></xs:simpleType>
</xs:element><xs:element ref="email" />
</xs:choice></xs:complexType>
</xs:element>
How to Create Element GroupsHow to Create Element Groups
<xs:group name="contactDetails"><xs:all>
<xs:element name="telephone" type="xs:string" /><xs:element name="email" type="xs:string" /><xs:element name="web" type="xs:anyURI" minOccurs="0" />
</xs:all></xs:group><xs:element name="employee">
<xs:complexType><xs:sequence>
<xs:element name="name" type="xs:string" /><xs:group ref="contactDetails" />
</xs:sequence></xs:complexType>
</xs:element>
<xs:group name="contactDetails"><xs:all>
<xs:element name="telephone" type="xs:string" /><xs:element name="email" type="xs:string" /><xs:element name="web" type="xs:anyURI" minOccurs="0" />
</xs:all></xs:group><xs:element name="employee">
<xs:complexType><xs:sequence>
<xs:element name="name" type="xs:string" /><xs:group ref="contactDetails" />
</xs:sequence></xs:complexType>
</xs:element>
<xs:element name="company"><xs:complexType>
<xs:sequence><xs:element name="businessName" type="xs:string"
/><xs:element name="DUNS">
<xs:simpleType><xs:restriction base="xs:integer">
<xs:totalDigits value="9" />
</xs:restriction></xs:simpleType>
</xs:element><xs:element name="CEO" type="employee" /><xs:group ref="contactDetails" />
</xs:sequence></xs:complexType>
</xs:element>
<xs:element name="company"><xs:complexType>
<xs:sequence><xs:element name="businessName" type="xs:string"
/><xs:element name="DUNS">
<xs:simpleType><xs:restriction base="xs:integer">
<xs:totalDigits value="9" />
</xs:restriction></xs:simpleType>
</xs:element><xs:element name="CEO" type="employee" /><xs:group ref="contactDetails" />
</xs:sequence></xs:complexType>
</xs:element>
How to Create Attribute GroupsHow to Create Attribute Groups
<xs:attributeGroup name="dimensions"><xs:attribute name="height" type="xs:integer" /><xs:attribute name="width" type="xs:integer" /><xs:attribute name="depth" type="xs:integer" />
</xs:attributeGroup><xs:element name="product">
<xs:complexType><xs:sequence>
<xs:element name="name" type="xs:string"><xs:element name="price" type="xs:decimal">
</xs:sequence><xs:attributeGroup ref="dimensions" />
</xs:complexType></xs:element>
<xs:attributeGroup name="dimensions"><xs:attribute name="height" type="xs:integer" /><xs:attribute name="width" type="xs:integer" /><xs:attribute name="depth" type="xs:integer" />
</xs:attributeGroup><xs:element name="product">
<xs:complexType><xs:sequence>
<xs:element name="name" type="xs:string"><xs:element name="price" type="xs:decimal">
</xs:sequence><xs:attributeGroup ref="dimensions" />
</xs:complexType></xs:element>
Derive New Complex TypesDerive New Complex Types
<xs:complexType name="Address"><xs:sequence>
<xs:element name="street" type="xs:string" /><xs:element name="city" type="xs:string" />
</xs:sequence></xs:complexType><xs:complexType name="USAddress">
<xs:complexContent><xs:extension base="Address">
<xs:sequence><xs:element name="state" type="xs:string" /><xs:element name="zip" type="xs:integer" />
</xs:sequence></xs:extension>
<xs:complexContent></xs:complexType>
<xs:complexType name="Address"><xs:sequence>
<xs:element name="street" type="xs:string" /><xs:element name="city" type="xs:string" />
</xs:sequence></xs:complexType><xs:complexType name="USAddress">
<xs:complexContent><xs:extension base="Address">
<xs:sequence><xs:element name="state" type="xs:string" /><xs:element name="zip" type="xs:integer" />
</xs:sequence></xs:extension>
<xs:complexContent></xs:complexType>
<xs:complexType name="NYAddress"><xs:complexContent>
<xs:restriction base="USAddress"><xs:sequence>
<xs:element name="street" type="xs:string" />
<xs:element name="city" type="xs:string" />
<xs:element name="state" type="xs:string“ fixed="NY" /><xs:element name="zip"
type="xs:integer" /></xs:sequence>
</xs:restriction><xs:complexContent>
</xs:complexType>
<xs:complexType name="NYAddress"><xs:complexContent>
<xs:restriction base="USAddress"><xs:sequence>
<xs:element name="street" type="xs:string" />
<xs:element name="city" type="xs:string" />
<xs:element name="state" type="xs:string“ fixed="NY" /><xs:element name="zip"
type="xs:integer" /></xs:sequence>
</xs:restriction><xs:complexContent>
</xs:complexType>
Recommended