Você está na página 1de 51

Introduo ao XML Schema

XML Schema uma alternativa ao DTD baseada em XML. Um esquema XML descreve a estrutura de um documento XML. A linguagem XML Schema tambm chamada de XML Schema Definition (XSD).

O que voc j precisa saber


Antes de estudar a Linguagem XML Schema, voc deve ter um entendimento bsico de XML e Namespaces XML. Tambm vlido um entendimento bsico de DTD. Se voc deseja estudar estes assuntos primeiro, visite o tutorial XML e o tutorial DTD.

O que um XML Schema?


O propsito de um XML Schema definir os blocos de construo permitidos em um documento XML, como um DTD. Um XML Schema: define elementos que podem aparecer em um documento define atributos que podem aparecer em um documento define que elementos so elementos filhos define a ordem dos elementos filhos define o nmero de elementos filhos define se um elemento vazio ou pode incluir texto define tipos de dados para elementos e atributos define valores padro e fixos para elementos e atributos

XML Schemas so sucessores das DTDs


Ns acreditamos que logo XML Schemas vo ser usados na maioria das aplicaes Web no lugar de DTDs. Aqui esto algumas razes: XML Schemas so extensveis para adies futuras XML Schemas so mais ricos e teis que DTDs XML Schemas so escritos em XML XML Schemas suportam tipos de dados XML Schemas suportam namespaces

XML Schema uma Recomendao do W3C


XML Schema foi originalmente proposto pela Microsoft, mas se tornou um recomendao oficial do W3C em Maio de 2001. A especificao est estvel e foi revisada pelos membros do W3C. Para uma viso geral das atividades e status do W3C, visite o tutorial W3C

XML Schemas - Por que?


H muitas razes para XML Schema ser melhor que DTD.

XML Schema tem suporte a tipos de dados

Uma das grandes vantagens de XML Schemas o suporte a tipos de dados: mais fcil descrever contedo de documentos permissveis mais fcil validar os dados mais fcil trabalhar com dados de um banco de dados mais fcil definir restries aos dados mais fcil definir padres/formatos de dados mais fcil converter dados entre diferentes tipos

XML Schemas usa sintaxe XML


Outra grande fora do XML Schema ser escrito em XML. Por isso: Voc no tem que aprender outra linguagem Voc pode usar seu editor XML para editar seus arquivos XML Schema Voc pode usar seu parser XML para verificar seus arquivos XML Schema Voc pode manipular seu XML Schema com XML DOM Voc pode usar seu XML Schema com XSLT

Comunicao segura de dados com XML Schemas


Quando um dado enviado de um ponto para outro essencial que as duas parte tem a mesma expectativa sobre o contedo. Com XML Schemas, o remetente pode descrever o dado de forma que o receptor v entender. Uma data como "03-11-2004" vai, em alguns pases, ser interpretada como 3 de Novembro e em outros com 11 de Maro, mas um elemento XML com um tipo de dado como esse:

<date type="date">2004-03-11</date> assegura um entendimento mtuo do contedo porque o o tipo de dado XML requer o formato YYYY-MM-DD.

XML Schemas so extensveis


XML Schemas so extensveis, assim como XML, porque eles so escritos em XML. Com uma definio extensvel voc pode: Reutilizar seu Schema em outros Schemas Criar seus prprios tipos de dados derivados dos tipos padres Referenciar mltiplos esquemas em um mesmo documento

Bem formado no o bastante


Um documento XML bem formado um documento que atende s regras de sintaxe XML: deve comear com um declarao XML

deve ter um elemento raiz nico todas tags abertas precisam ser fechadas tags XML so sensveis caixa alta/baixa todo elemento deve ser fechado todo elemento tem que ser propriamente aninhado todos valores de atributos precisam estar entre aspas entidades XML devem ser usadas para caracteres especiais

Mesmo se os documentos so bem formados eles podem conter erros, e estes erros podem ter conseqncias srias. Imagine essa situao: voc compra 5 tonners de impressoras laser, ao invs de 5 impressoras laser. Com XML Schemas, a maioria destes erros podem ser detectados pelo seu software de validao.

XSD How To
Documentos XML podem referenciar um DTD ou um XML Schema.

Um documento XML simples


Veja este documento XML chamado "note.xml":

<?xml version="1.0"> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder<heading> <body>Don't forget me this weekend!</body> </note>

Um DTD simples
Este um arquivo DTD chamado "note.dtd" que define os elementos do documento XML acima ("note.xml"):

<!ELEMENT note (to, from, heading, body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> A linha 1 define que o elemento note possui 4 elementos: "to, from, heading, body". Linhas 2 a 5 o elemento to como sendo do tipo "#PCDATA", o elemento from como "#PCDATA", e assim por diante...

Um XML Schema simples


Este um arquivo XML Schema chamado "note.xsd" que define os elementos do documento XML acima ("note.xml"):

?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3schools.com" xmlns="http://www.w3schools.com" elementFormDefault="qualified">

<xs:element name="note"> <xs:complexType> <xs:sequence> <xs:element name="to" type="xs:string"/> <xs:element name="from" type="xs:string"/> <xs:element name="heading" type="xs:string"/> <xs:element name="body" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element>

</xs:schema> O elemento note dito um tipo complexo porque contm outros elementos. Os outros elementos so ditos tipos simples porque no contm outros elementos. Voc vai aprender mais sobre tipos simples e complexo nos prximos captulos.

Uma referncia para um DTD


Este documento XML tem uma referncia para um DTD:

<?xml version="1.0"?>

<!DOCTYPE note SYSTEM "http://www.w3schools.com/dtd/note.dtd">

<note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>

Uma referncia a um XML Schema


Este documento contm uma referncia a um XML Schema:

<?xml version="1.0"?>

<note xmlns="http://www.w3schools.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3schools.com note.xsd">

<to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>

XSD - O elemento <schema>


O elemento <schema> o elemento raiz de todo XML Schema!

O elemento <schema>
O elemento <schema> o elemento raiz de todo XML Schema:

<?xml version="1.0"?>

<xs:schema>

... ...

</xs:schema> O elemento <schema> pode conter alguns atributos. Uma declarao de Schema geralmente parece com isto:

<?xml version="1.0"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3schools.com" xmlns="http://www.w3schools.com" elementFormDefault="qualified">

...

...

</xs:schema> O seguinte fragmento:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" indica que os elementos e tipos de dados usados no esquema (schema, element, complexType, sequence, string, boolean, etc.) vm do namespace "http://www.w3.org/2001/XMLSchema". Ele tambm especifica que os elementos e tipos de dados que vm de "http://www.w3.org/2001/XMLSchema" devem ser prefixados com xs: !! Este fragmento:

targetNamespace="http://www.w3schools.com" indica que os elementos definidos por este esquema (note, to, from, heading, body) vm do namespace "http://www.w3schools.com" . Este fragmento:

xmlns="http://www.w3schools.com" indica que o namespace padro "http://www.w3schools.com". Este fragmento:

elementFormDefault="qualified"> indica que todo elemento usado por uma instncia de documento XML que foi declarado neste esquema deve ser qualificado pelo namespace.

Referenciando um Schema em um documento XML


Este documento XML tem uma referncia para um XML Schema:

<?xml version="1.0"?>

<note xmlns="http://www.w3schools.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3schools.com note.xsd">

<to>Tove</to> <from>Jani</from> <heading>Reminder</heading>

<body>Don't forget me this weekend!</body> </note> Este fragmento:

xmlns="http://www.w3schools.com" especifica a declarao de namespace padro. Esta declarao diz ao validador de esquema que os elementos usados neste documento XML so declarados no namespace "http://www.w3schools.com". Uma vez que voc tem uma instncia XML Schema do namespace disponvel:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" voc pode usar o atributo schemaLocation. Este atributo tem dois valores. O primeiro o namespace usado. O segundo a localizao do esquema XML para se usado pelo namespace:

xsi:schemaLocation="http://www.w3schools.com note.xsd">

Elementos XSD Simples


XML Schemas define os elementos de um arquivo XML. Um elemento simples um elemento XML que contm apenas texto. Ele no pode conter outros elementos ou atributos.

O que um elemento simples


Um elemento simples um elemento XML que contm apenas texto. Ele no pode conter outros elementos ou atributos. Entretanto, a restrio "apenas texto" pouco clara. O texto pode ser de diferentes tipos. Pode ser um dos tipos inclusos na definio de XML Schema (boolean, string, date, etc.), ou um tipo personalizado que voc mesmo pode definir.

Como definir um elemento simples


A sintaxe para definir um elemento simples :

<xs:element name="xxx" type="yyy"/> onde xxx o nome do elemento e yyy o tipo de dado do elemento. Aqui est alguns elementos XML:

<lastname>Refsnes</lastname> <age>34</age>

<dateborn>1968-03-27</dateborn> E aqui as definies correspondentes:

<xs:element name="lastname" type"xs:string"/> <xs:element name="age" type="xs:integer"/> <xs:element name="dateborn" type="xs:date"/>

Tipos de dados XML Schema comuns


XML Schema tem vrios tipos de dados prprios. Aqui est uma lista dos mais comuns: xs:string xs:decimal xs:integer xs:boolean xs:date xs:time

Declare valores padro e fixos para elementos simples


Elementos simples podem ter um conjunto de valores padro OU um fixos. Um valor padro automaticamente atribudo ao elemento quando nenhum outro valor especificado. No exemplo seguinte, o valor padro "red":

<xs:element name="color" type="xs:string" default="red"/> Um valor fixo tambm atribudo automaticamente ao elemento. Voc no pode especificar outro valor. No exemplo a seguir, o valor fixo "red":

<xs:element name="color" type="xs:string" fixed="red"/>

Atributos XSD
Todos atributos so declarados como tipos simples. Apenas elementos complexos tem atributos!

O que um atributo?
Elementos simples no podem ter atributos. Se um elemento tem atributos, ele considerado do tipo complexo. Mas atributos so declarados como tipos simples. Isso significa que um elemento com atributos sempre tem uma definio do tipo complexo.

Como definir um atributo


A sintaxe para definir um atributo :

<xs:attribute name="xxx" type="yyy"/> onde xxx o nome do atributo e yyy o tipo de dado do atributo. Aqui est um elemento XML com um atributo:

<lastname lang="EN>Smith</lastname> E aqui a definio correspondente do atributo:

<xs:attribute name="lang" type="xs:string"/>

Tipos de dados comuns do XML Schema


XML Schema tem vrios tipos de dados prprios. Aqui est uma lista dos mais comuns: xs:string xs:decimal xs:integer xs:boolean xs:date xs:time

Declare valores padro e fixo para atributos


Atributos podem ter valores padro OU fixo especificados. Um valor padro atribudo automaticamente ao atributo quando nenhum outro valor especificado. No exemplo seguinte, o valor padro "EN":

<xs:attribute name="lang" type="xs:string" default="EN"> Um valor fixo atribudo automaticamente ao atributo. Voc no pode especificar outro valor. No exemplo seguinte, o valor fixo "EN":

<xs:attribute name="lang" type="xs:string" fixed="EN"/>

Criando atributos opcionais e obrigatrios


Todos atributos so opcionais por padro. Para especificar explicitamente que um atributo opcional, utilize o atributo "use":

<xs:attribute name="lang" type="xs:string" use="optional"/> Para fazer um atributo obrigatrio:

<xs:atrribute name="lang" type="xs:string" use="required"/>

Restries de contedo
Quando um elemento ou um atributo XML tem um tipo definido, isto cria uma restrio ao contedo dele. Se um elemento XML do tipo "xs:date" e contm um string como "Hello Mother", o elemento no vai ser validado. Mas, h mais... com XML Schemas, voc pode adicionar suas prprias restries aos seus elementos e atributos XML. Estas restries so chamadas facets. Voc pode ler mais sobre facets no prximo captulo.

Restries/facets XSD
Restries so usadas para controlar os valores aceitos para elementos e atributos XML. Restries em elementos XML so chamados facets.

Restries em valores
Este exemplo define um elemento chamado "age" com um restrio. O valor de age no pode ser menor que 0 ou maior que 100:

<xs:element name="age">

<xs:simpleType> <xs:restriction base="xs:integer"> <xs:minInclusive value="0"/> <xs:maxInclusive value="100"/> </xs:restriction> </xs:simpleType>

</xs:element>

Restries em conjuntos de valores


Para limitar o contedo de um elemento XML em um conjunto de valores aceitveis, ns podemos usar restries enumeradas. Este exemplo define um elemento chamado "car":

<xs:element name="car">

<xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value-"Audi"/> <xs:enumeration value="Golf"/> <xs:enumeration value="BMW"/> </xs:restriction>

</xs:simpleType>

</xs:element> O elemento "carro" um tipo simples com restrio. Os valores aceitveis so: Audi, Golf, BMW. O exemplo acima tambm poderia ser escrito assim:

<xs:element name="car" type="carType">

<xs:simpleType name="carType"> <xs:restriction base="xs:string"> <xs:enumeration value="Audi"/> <xs:enumeration value="Golf"/> <xs:enumeration value="BMW"/> </xs:restriction> <xs:simpleType> Nota: Neste caso o tipo "carType" pode ser usado por outros elementos, porque ele no parte do elemento "car".

Restries em sries de valores


Para limitar o contedo de um elemento XML em uma srie de nmeros ou letras, podemos utilizar a restrio de padro. Este exemplo define o elemento chamado "letter":

<xs:element name="letter">

<xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="[a-z]"/> </xs:restriction> </xs:simpleType>

</xs:element> O elemento "letter" do tipo simples com uma restrio. O nico valor aceitvel UMA das letras MINSCULAS de a at z. O prximo exemplo define um elemento chamado "initials":

<xs:element name="initials">

<xs:simpleType> <xs: restriction base="xs:string"> <xs:pattern value="[A-Z][A-Z][A-Z]"/> <xs:restriction> </xs:simpleType>

<xs:element> O elemento "initials" simples com um restrio. O nico valor aceitvel so TRS letras MAiSCULAS de a at z. Este exemplo tambm define um elemento chamado "initials":

<xs:element name="initials">

<xs:simpleType> <xs:restriction base="xs:string"> <xs:patter value="[a-zA-Z][a-zA-Z][a-zA-Z]"/> </xs:restriction> <xs:simpleType>

<xs:element> O elemento "initials" do tipo simples com restrio. O nico valor aceitvel so TRS letras MINSCULAS ou MAISCULAS de a at z. Este exemplo define um elemento chamado "choice":

<xs:element name="choice">

<xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="[xyz]"/> </xs:restriction> </xs:simpleType>

</xs:element> O elemento "choice" um tipo simples com restrio. O nico valor aceitvel UMA das seguintes letras: x, y, OU z. O prximo exemplo define um elemento chamado "prodid":

<xs:element name="prodid">

<xs:simpleType> <xs:restriction base="xs:integer"> <xs:patter value="[0-9][0-9][0-9][0-9][0-9]"/> </xs:restriction> </xs:simpleType>

</xs:element> O elemento "prodid" um tipo simples com restrio. O nico valor aceitvel so CINCO dgitos em seqncia, e cada dgito deve estar entre 0 e 9.

Outras restries em sries de valores


Algumas outras restries que podem ser definidas por restrio de padro: Este exemplo define um elemento chamado "letter":

<xs:element name="letter">

<xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="([a-z])*"/> </xs:restriction> </xs:simpleType>

</xs:element> O elemento "letter" um tipo simples com restrio. O valor aceitvel zero ou mais ocorrncias de letras minsculas de a at z. Este exemplo tambm define um elemento chamado "letter":

<xs:element name="letter">

<xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="([a-z][A-Z])+"/> </xs:restriction> </xs:simpleType>

</xs:element>

O elemento "letter" um tipo simples com um restrio. O valor aceitvel uma ou mais ocorrncias de um letra minscula seguida de uma letra maiscula de a at z. Este exemplo define um elemento chamado "gender":

<xs:element name="gender">

<xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="male|female"/> </xs:restriction> </xs:simpleType>

</xs:element> O elemento "gender" um tipo simples com uma restrio. O nico valor aceitvel male OU female. Este exemplo define um elemento chamado "password":

<xs:element name="password">

<xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="[a-zA-Z0-9]{8}"/> </xs:restriction> </xs:simpleType>

<xs:element> O elemento "password" um tipo simples com um restrio. Deve haver exatamente oito caracteres e estes caracteres devem ser letras minsculas ou maisculas de a at x, ou um nmero de 0 a 9.

Restries em caracteres vazios


Para especificar como um caractere vazio deve ser tratado, devemos usar a restrio whiteSpace. Este exemplo define um elemento chamado "adderess":

<xs:element name="adress">

<xs:simpleType> <xs:restriction base="xs:string">

<xs:whiteSpace value="preserve"/> <xs:restriction> </xs:simpleType>

</xs:element> O elemento "adress" um tipo simples com um restrio. A restrio whiteSpace definida como "preserve", qu significa que o processador XML NO VAI remover nenhum caractere vazio. Este exemplo tambm define um elemento chamado "address":

<xs:element name="address">

<xs:simpleType> <xs:restriction base="xs:string"> <xs:whiteSpace value="replace"/> </xs:restriction> </xs:simpleType>

</xs:element> Este elemento "address" um tipo simples com um restrio. A restrio whiteSpace definida como "replace", que significa que o processador XML VAI SUBSTITUIR todos caracteres vazios (quebras de linha, tabs, espaos) com espaos. Este exemplo tambm define um elemento chamado "address":

<xs:element name="address">

<xs:simpleType> <xs:restriction base="xs:string"> <xs:whiteSpace value="collapse"/> </xs:restriction> </xs:simpleType>

</xs:element> Este elemento "address" um tipo simples com uma restrio. A restrio whiteSpace definida como "collapse", que significa que o processador XML VAI REMOVER todos caracteres vazios (quebras de linha, tabs, espaos so substitudos com espaos, espaos iniciais e finais so removidos, espaos mltiplos so reduzidos a um).

Restries de comprimento

Para limitar o comprimento de um elemento, ns usamos as restries de comprimento, maxLength e minLength. Este exemplo define um elemento chamado "password":

<xs:element name="password">

<xs:simpleType> <xs:restriction base="xs:string"> <xs:length value="8"/> </xs:restriction> </xs:simpleType>

</xs:element> O elemento "password" um tipo simples com uma restrio. O valor deve ter exatamente oito caracteres. Este exemplo define outro elemento chamado "password":

<xs:element name="password">

<xs:simpleType> <xs:restriction base="xs:string"> <xs:minLength value="5"/> <xs:maxLength value="8"/> </xs:restriction> </xs:simpleType>

</xs:element> Este elemento "password" um tipo simples com uma restrio. O valor deve ter no mnimo cinco e no mximo oito caracteres.

Restries para tipos de dados


Restrio enumeration fractionDigits length maxExclusive Descrio Define uma lista de valores vlidos Especifica o nmero mximo casas decimais permitidas. Deve ser igual ou maior que zero Especifica o nmero exato de caracteres ou itens permitidos. Deve ser igual ou maior que zero Especifica o valor mximo para valores numricos (o valor deve ser menor que este valor)

maxInclusive maxLength minExclusive minInclusive minLength pattern totalDigits whiteSpace

Especifica o valor mximo para valores numricos (o valor deve ser menor ou igual a este valor) Especifica o nmero mximo de caracteres ou itens permitidos. Deve ser igual ou maior que zero Especifica o valor mnimo para valores numricos (o valor deve ser maior que este valor) Especifica o valor mnimo para valores numricos (o valor deve ser maior ou igual a este valor) Especifica o nmero mnimo de caracteres ou itens permitidos. Deve ser igual ou maior que zero Define a seqncia exata de caracteres permitidos Especifica o nmero exato de digitos permitidos. Deve ser maior que zero Especifica como caracteres vazios (tabs, espaos e retornos de carro) so tratados

Elementos XSD complexos


Um elemento complexo contm outros elementos e/ou atributos.

O que um elemento complexo ?


Um elemento complexo um elemento XML que contm outros elementos e/ou atributos. H quatro tipos de elementos complexos: elementos vazios elementos que contm apenas outros elementos elementos que contm apenas texto elementos que contm tanto outros elementos quanto texto

Nota: Cada um desses elementos podem conter atributos tambm!

Exemplos de elementos XML complexos


Um elemento XML complexo, "product", que vazio:

<product pid="1245"/> Um elemento XML complexo, "employee", que contm apenas outros elementos:

<employee> <firstname>John</firstname> <lastname>Smith</lastname> </employee> Um elemento XML complexo, "food", que contm apenas texto:

<food type="dessert">Ice cream</food> Um elemento XML complexo, "description", que contm outros elementos e texto:

<description> It happened on <date lang="norwegian">03.03.99</date> .... </description>

Como definir um elemento complexo


Observe este elemento XML complexo, "employee", que contm apenas outros elementos:

<employee> <firstname>John</firstname> <lastname>Smith</lastname> </employee> Ns podemos definir um elemento complexo em um XML Schema de diferente maneiras: 1. O elemento "employee" pode ser declarado diretamente, nomeando o elemento:

<xs:element name="employee"> <xs:complexType> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> <xs:sequence> </xs:complexType> </xs:element> Se voc usar o mtodo descrito acima, apenas o elemento "employee" pode usar o tipo complexo definido. Note que os elementos filhos, "firstname" e "lastname", so envolvidos pelo indicador <sequence>. Isto significa que os elementos filhos devem aparecer na mesma ordem da declarao: "firstname" primeiro e "lastname" depois. Voc vai aprender sobre indicadores no captulo Indicadores XSD; 2. O elemento "employee" pode ter um atributo tipo que faz referncia ao nome do tipo complexo que deve ser usado:

<xs:element name="employee" type="personinfo"/>

<xs:complexType name="personinfo"> <xs:sequence>

<xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string/"> </xs:sequence> </xs:complexType> Se voc usar o mtodo descrito acima, vrios elementos podem fazer referncia ao mesmo tipo complexo, assim:

<xs:element name="employee" type="personinfo"/> <xs:element name="student" type="personinfo"/> <xs:element name="member" type="personinfo"/>

<xs:complexType name="personinfo"> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> </xs:sequence> </xs:complexType> Voc tambm pode basear um elemento do tipo complexo em um tipo complexo existente e adicionar alguns elementos, assim:

<xs:element name="employee" type="fullpersoninfo"/>

<xs:complexType name="personinfo"> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="personinfo" type="xs:string"/> </xs:sequence> </xs:complexType>

<xs:complexType name="fullpersoninfo"> <xs:complexContent> <xs:extension base="personinfo"> <xs:sequence> <xs:element name="address" type="xs:string"/> <xs:element name="city" type="xs:string"/> <xs:element name="country" type="xs:string"/> </xs:sequence> </xs:extension> </xs:complexContent>

<xs:complexType>

Elementos complexos vazios


Um elemento complexo vazio pode conter atributos; mas no pode ter nenhum contedo entre as tags de abertura e fechamento.

Defina tipos complexos para elementos vazios


Um elemento XML vazio:

<product prodid="1345"/> O elemento "product" acima no tem contedo. Para definir um tipo sem contedo, ns devemos definir um tipo que permita apenas elementos em seu contedo, mas ns no declaramos nenhum elemento realmente, assim:

<xs:element name="product"> <xs:complexType> <xs:complexContent> <xs:restriction base="xs:integer"> <xs:attribute name="prodid" type="xs:positiveInteger"/> </xs:restriction> </xs:complexContent> </xs:complexType> </xs:element> No exemplo acima, ns definimos um complexType tento complexContent, i.e. apenas elementos. O elemento complexContent diz que queremos restringir ou extender o modelo de contedo de um tipo complexo, e a restrio de inteiros declara um atributo mas no cria nenhum elemento. Entretanto, possvel declarar o elemento product de forma mais compacta, assim:

<xs:element name="product"> <xs:complexType> <xs:attribute name="prodid" type="xs:positiveInteger"/> </xs:complexType> </xs:element> Ou voc pode dar um nome ao complexType, e fazer o elemento "product" ter um tipo que faz referncia ao nome do complexType (se voc usar este mtodo, vrios elementos podem referenciar o mesmo tipo complexo):

<xs:element name="product" type="prodtype"/>

<xs:complexType name="prodtype"> <xs:atrribute name="prodid" type="xs:positiveInteger"/> </xs:complexType>

Tipos complexos apenas elementos


Um tipo complexo "apenas elementos" contm um elemento que contm apenas outros elementos.

Defina tipos complexos apenas com elementos


Um elemento XML, "person", que contm apenas outros elementos:

<person> <firstname>John</firstname> <lastname>Smith</lastname> </person> Voc pode definir o elemento "person" em um esquema, assim:

<xs:element name="person"> <xs:complexType> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> Note a tag <xs:sequence>. Isto significa que os elementos definidos ("firstname" e "lastname") devem aparecer nesta ordem dentro do elemento "person". Ou voc pode dar um nome ao complexType, e um atributo type ao elemento "person" que faz referncia a ele (se voc usar este mtodo, vrios elementos podem referenciar o mesmo tipo complexo).

<xs:element name="person" type="persontype"/>

<xs:complexType name="persontype"> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> </xs:sequence>

</xs:complexType>

Elementos complexos apenas texto


Um elemento complexo texto pode conter tanto atributos quanto texto.

Defina um elemento complexo apenas texto


Este tipo contm apenas contedo simples (texto e atributos), assim ns adicionamos um elemento simpleContent em torno do contedo. Quando usar contedo simples, voc precisa definir uma extenso OU uma restrio com o elemento simpleContent, assim:

<xs:element name="somename"> <xs:complexType> <xs:simpleContent> <xs:extension base="basetype"> .... .... </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element>

OU

<xs:element name="somename"> <xs:complexType> <xs:simpleContent> <xs:restriction base="basetype"> .... .... </xs:restriction> </xs:simpleContent> </xs:complexType> </xs:element> Dica: Use o elemento extension para expandir o tipo simples base de um elemento, e o elemento restriction para limit-lo. Aqui est um exemplo de um elemento XML, "shoesize", que contm apenas texto: <shoesize country="france">35</shoesize> O exemplo a seguir declara um complexType, "shoesize". O contedo definido como tipo de dado integer e o elemento "shoesize" tambm contm um atributo chamado "country":

<xs:element name="shoesize"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:integer": <xs:attribute name="country" type="xs:string"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> Ns tambm poderamos definir um nome para o complexType, e especificar um atributo type ao elemento "shoesize" que faz referncia ao nome do complexType (se voc usar este mtodo, vrios elementos podem referenciar o mesmo tipo complexo):

<xs:element name="shoesize" type="shoetype"/>

<xs:complexType name="shoetype"> <xs:simpleContent> <xs:extension base="xs:integer"> <xs:attribute name="country" type="xs:string"/> </xs:extension> </xs:simpleContent> </xs:complexType>

Tipos complexos com contedo misto


Um elemento do tipo complexo misto pode conter atributos, elementos, e texto.

Defina tipos complexos com contedo misto


Um elemento XML, "letter", que contm tanto outros elementos quanto texto:

<letter> Dear Mr.<name>John Smith</nam> Your order <orderid>1032</orderid> wil be shipped on <shipdate>2001-07-13</shipdate>. </letter> Note o texto que aparece entre os elementos. "name", "orderid", e "shipdate" so todos filhos de "letter". O seguinte esquema declara o elemento "letter":

<xs:element name="letter">

<xs:complexType mixed="true"> <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name="orderid" type="xs:positiveInteger"/> <xs:element name="shipdate" type="xs:date"/> </xs:sequence> </xs:complexType> <xs:element> Nota: Para permitir que caracteres apaream entre os elementos filhos de "letter", o atributo mixed deve ser definido como "true". A tag <xs:sequence> significa que os elementos definidos (name, orderid e shipdate) devem parecer nesta ordem no elemento "letter". Ns tambm poderamos dar um nome ao elemento complexType, e definir o atributo type de "letter" como uma referncia a ele (se voc usar este mtodo, vrios elementos podem fazer referncia ao mesmo complexType):

<xs:element name="letter" type="lettertype"/>

<xs:complexType name="lettertype" mixed="true"> <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name="orderid" type="xs:positiveInteger"/> <xs:element name="shipdate" type="xs:date"/> </xs:sequence> </xs:complexType>

Indicadores de tipos complexos


Ns podemos controlar COMO os elementos sero usados em documentos atravs de indicadores.

Indicadores
Ns temos sete tipos de indicadores: Indicadores de ordem: All Choice Sequence

Indicadores de ocorrncia: maxOccurs minOccurs

Indicadores de grupo: Group name attributeGroup name

Indicadores de ordem
Indicadores de ordem so usados para definir a ordem em que os elementos ocorrem.

Indicador All
O indicador <all> especifica por padro que os elementos filhos podem aparecer em qualquer ordem e que cada um deve ocorrer, e apenas uma vez:

<xs:element name="person"> <xs:complexType> <xs:all> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> </xs:all> </xs:complexType> </xs:element> Nota: Usando o indicador <all> voc pode especificar o indicador <minOccurs> em 0 ou 1 e <maxOccurs> s pode ser 1 (<minOccurs> e <maxOccurs> so descritos adiante).

Indicador choice
O indicador <choice> especifica que um elemento filho ou outro pode ocorrer:

<xs:element name="person"> <xs:complexType> <xs:choice> <xs:element name="employee" type="employee"/> <xs:element name="member" type="member"/> </xs:choice> </xs:complexType> </xs:element>

Indicador sequence
O indicador <sequence> especifica que os elementos filhos devem aparecer em uma ordem especfica:

<xs:element name="person"> <xs:complexType>

<xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element>

Indicadores de ocorrncia
Indicadores de ocorrncia so usados para indicar com que freqncia um elemento pode ocorrer. Nota: Para todos indicadores "Order" e "Group" (any, all, choice, sequence, group, name, e group reference) o valor padro de maxOccurs e minOccurs 1!!!

Indicador maxOccurs
O indicador <maxOccurs> especifica o nmero mximo de vezes que um elemento pode ocorrer:

<xs:element name="person"> <xs:complexType> <xs:sequence> <xs:element name="full_name" type="xs:string"/> <xs:element name="child_name" name="child_name" type="xs:string" maxOccurs="10"/> </xs:sequence> </xs:complexType> </xs:element> O exemplo acima indica que o elemento "child_name" pode ocorre no mnimo uma vez (o valor padro para minOccurs 1) e no mximo dez vezes em um elemento "person".

Indicador minOccurs
O indicador <minOccurs> especifica o nmero mnimo de vezes que um elemento pode ocorrer:

<xs:element name="person"> <xs:complexType> <xs:sequence> <xs:element name="full_name" type="xs:string"/> <xs:element name="child_name" type="xs:string" maxOccurs="10" minOccurs="0"/> </xs:sequence> </xs:complexType>

</xs:element> O exemplo acima indica que o elemento "child_name" pode ocorrer um mnimo de zero vezes e um mximo de dez em um elemento "person". Para permitir que um elemento parea um nmero ilimitado de vezes, use a instruo maxOccurs="unbounded":

Um exemplo prtico
Um arquivo XML chamado "Myfamily.xml":

<?xml version="1.0" encoding="ISO-8859-1"?>

<persons xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="family.xsd">

<person> <full_name>Hege Refsnes</full_name> <child_name>Cecilie</child_name> </person>

<person> <full_name>Tove Refsnes</full_name> <child_name>Hege</child_name> <child_name>Stale</child_name> <child_name>Jim</child_name> <child_name>Borge</child_name> </person>

<person> <full_name>Stale Refsnes</full_name> </person>

</persons> O arquivo XML acima contm um elemento raiz chamado "persons". Dentro deste elemento est definido vrios elementos "person". Cada elemento "person" deve conter um elemento filho "full_name" e pode conter at cinco elementos filho "child_name". Aqui est o esquema "family.xsd":

<xml version="1.0" encoding="ISO-8859-1"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

<xs:element name="persons"> <xs:complexType> <xs:sequence> <xs:element name="person" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> type="xs:string"/> type="xs:string" <xs:element name="full_name" <xs:element name="child_name" minOccurs="0" maxOccurs="5"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element>

</xs:schema>

Indicadores de grupo
Indicadores de grupo so usados para definir grupos de elementos relacionados.

Elementos de grupo
Elementos de grupo so definidos com a declarao group, assim:

<xs:group name="groupname"> ... </xs:group> Voc deve deve definir um elemento all, choice, ou sequence dentro da declarao group. O exemplo seguinte define um grupo chamado "persongroup", que define um grupo de elementos que devem ocorrer em uma seqncia exata:

<xs:group name="persongroup"> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> <xs:element name="birthday" type="xs:date"/> </xs:sequence> </xs:group>

Depois que voc definiu um grupo, voc pode referenci-lo na definio de outro grupo ou tipo complexo, assim:

<xs:group name="persongroup"> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> <xs:element name="birthday" type="xs:date"/> </xs:sequence> </xs:group>

<xs:element name="person" type="personinfo"/>

<xs:complexType name="personinfo"> <xs:sequence> <xs:group ref="persongroup"/> <xs:element name="country" type="xs:string"/> </xs:sequence> </xs:complexType>

Grupos de atributos
Grupos de atributos so definidos com a declarao attributeGroup, assim:

<xs:attributeGroup name="groupname"> ... </xs:attributeGroup> O exemplo a seguir define um grupo de atributos chamado "personattrgroup":

<xs:attributeGroup name="personattrgroup"> <xs:attribute name="firstname" type="xs:string"/> <xs:attribute name="lastname" type="xs:string"/> <xs:attribute name="birthday" type="xs:date"/> </xs:attributeGroup> Depois que voc definiu um grupo de atributos, voc pode referenci-lo na definio de outro grupo ou tipo complexo, assim:

<xs:attributeGroup name="personattrgroup"> <xs:attribute name="firstname" type="xs:string"/> <xs:attribute name="lastname" type="xs:string"/>

<xs:attribute name="birthday" type="xs:date"/> </xs:attributeGroup>

<xs:element name="person" <xs:complexType> <xs:attributeGroup ref="personattrgroup"/> </xs:complexType> </xs:element>

O elemento <any>
O elemento <any> nos permite extender o documento XML com elementos no especificados no esquema. O exemplo a seguir um fragmento de um esquema XML chamado "family.xsd". Ele mostra uma declarao para o elemento "person". Usando o elemento <any> ns podemos extender (depois de <lastname>) o contedo de "person" com qualquer elemento:

<xs:element name="person"> <xs:complexType> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> <xs:any minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:eleement> Agora ns queremos extender o elemento "person" com um elemento "children". Neste caso ns podemos fazer isto, mesmo que o autor do esquema acima nunca tenha declarado o elemento "children"! Observer esse arquivo de esquema, chamado "children.xsd":

<?xml version="1.0" encoding="ISO-8859-1"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3schools.com" xmlns="http://www.w3schools.com" elementFormDefault="qualified">

<xs:element name="children"> <xs:complexType> <xs:sequence> <xs:element name="childname" type="xs:string"

maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element>

</xs:schema> O arquivo XML abaixo (chamado "Myfamily.xml"), usa componentes de dois esquemas diferentes; "family.xsd" e "children.xsd":

<?xml version="1.0" encoding="ISO-8859-1"?>

<person xmlns="http://www.microsoft.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:SchemaLocation="http://www.microsoft.com family.xsd http://www.w3schools.com children.xsd">

<person> <firstname>Hege</firstname> <lastname>Refsnes</lastname> <children> <childname>Cecilie</childname> </children> </person>

<person> <firstname>Stale</firstname> <lastname>Refsnes</lastname> </person>

</persons> O arquivo XMl acima vlido porque o esquema "family.xsd" nos permite extender o elemento "person" com um elemento opcional depois do elemento "lastname"! Os elementos <any> e <anyAttribute> so usados para fazer documentos EXTENSVEIS! Eles permitem aos documentos conterem elementos adicionais que no esto declarados no esquema XML!

O elemento <anyAttribute>
O elemento <anyAttribute> nos permite extender o documento XML com atributos que no foram especificados no esquema!

O elemento <anyAttribute>
O elemento <anyAttribute> nos permite extender o documento XML com atributos que no foram especificados no esquema. O exemplo a seguir um fragmento de um esquema XML chamado "family.xsd". Ele mostra uma declarao para o elemento "person". Usando o elemento <anyAttribute> ns podemos adicionar qualquer nmero de atributos ao elemento "person":

<xs:element name="person"> <xs:complexType> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> </xs:sequence> <xs:anyAttribute/> </xs:complexType> </xs:element> Agora ns queremos extender o elemento "person" com um atributo "gender". Neste caso ns podemos fazer isto, mesmo que o autor do esquema acima nunca tenha declaro nenhum atributo "gender"! Observe este arquivo de esquema, chamado "attribute.xsd":

<?xml version="1.0" encoding="ISO-8859-1"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://w3schools.com" xmlns="http://www.w3schools.com" elementFormDefault="qualified">

<xs:attribute name="gender"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="male|female"/> </xs:restriction> </xs:simpleType> </xs:attribute>

</xs:schema> O arquivo XML abaixo (chamado "Myfamily.xml"), utiliza componentes de dois esquemas diferentes; "family.xsd" e "attribute.xsd":

<?xml version="1.0" encoding="ISO-8859-1"?>

<persons xmlns="http://www.microsoft.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:SchemaLocation="http://www.microsoft.com family.xsd http://www.w3schools.com attribute.xsd">

<person gender="female"> <firstname>Hege</firstname> <lastname>Refsnes</lastname> </person>

<person gender="male"> <firstname>Stale</firstname> <lastname>Refsnes</lastname> </person>

</persons> O arquivo XML acima vlido porque o esquema "family.xsd" nos permite adicionar um atributo ao elemento "person"! Os elemento <any> e <anyAttribute> so usado para fazer documentos EXTENSVEIS! Eles permitem aos documentos conterem elementos adicionais que no foram declarados no esquema XML!

Substituio de elementos
Com XML Schemas um elemento pode substituir outro.

Substituio de elementos
Digamos que ns temos usurios de dois paises diferentes: Inglaterra e Noruega. Ns gostaramos de permitir ao usurio escolher se quer usar os nomes de elementos em ingls ou noruegus no documento XML. Para resolver este problema, ns podemos definir um substitutionGroup no esquema XML. Primeiro, n declaramos um elemento chave e ento ns declaramos outros elementos que so substituises para o elemento chave:

<xs:element name="name" type="xs:string"/> <xs:element name="navn" substitutionGroup="name"/> No exemplo acima, o elemento "name" o elemento chave e "navn" o elemento substituvel para "name". Observe esse fragmento de um esquema XML:

<xs:element name="name" type="xs:string"/> <xs:element name="navn" substitutionGroup="name"/>

<xs:complexType name="custinfo"> <xs:sequence> <xs:element ref="name"/> </xs:sequence> </xs:complexType>

<xs:element name="customer" type="custinfo"/> <xs:element name="kunde" substitutionGroup="customer"/> Um documento XML vlido (de acordo com o esquema acima) poderia parecer com isso:

<customer> <name>John Smith</name> </customer> ou com isso:

<kunde> <navn>John Smith</navn> </kunde>

Bloqueando substituio de elementos


Para prevenir que outros elementos substituam um elemento especfico, utilize o atributo block: <xs:element name="name" type="xs:string" block="substitution"/> Observe esse fragmento de um esquema XML:

<xs:element name="name" type="xs:string" block="substitution"/> <xs:element name="navn" substitutionGroup="name"/>

<xs:complexType name="custinfo"> <xs:sequence> <xs:element ref="name"/> </xs:sequence> </xs:complexType>

<xs:element name="customer" type="custinfo" block="substituion"/> <xs:element name="kunde" substitutionGroup="customer"/> Um documento XML vlido (de acordo com o esquema acima) parece-se com isso:

<customer> <name>John Smith</name> </customer> MAS ISSO NO MAIS VLIDO:

<kunde> <navn>John Smith</navn> </kunde>

Utilizando substitutionGroup
O tipo do elemento de substituio de ver o mesmo, ou derivdo, do tipo do elemento chave. Se o tipo do elemento de substituio o mesmo do elemento chave voc no precisar especific-lo. Note que todos elemento em um substitutionGroup (o elemento chave e os de substituio) de ser declarados como elementos globais, caso contrrio no funcionar!

O que so elementos globais?


Elementos globais so aqueles que so filhos imediatos do elemento "schema"! Elementos locais so elementos aninhados a outros elementos!

Um exemplo
Este captulo vai demostrar como escrever um XML Schema. Voc tambm aprender que um esquema pode ser escrito de diferentes maneiras.

Um documento XML
Vamos dar uma olhada nesse documento XML chamado "shiporder.xml":

<?xml version="1.0" encoding="ISO-8859-1"?>

<shiporder orderid="889923" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="shiporder.xsd"> <orderperson>John Smith</orderperson> <shipto> <name>Ola Nordmann</name>

<address>Langgt 23</address> <city>4000 Stavanger</city> <country>Norway</country> </shipto> <item> <title>Empire Burlesque</title> <note>Special Edition</note> <quantity>1</quantity> <price>10.90</price> </item> <item> <title>Hide your heart</title> <quantity>1</quantity> <price>9.90</price> </item> </shiporder> O documento XML acima consiste de um elemento raiz, "shiporder", que contm um atributo obrigatrio chamado "orderid". O elemento "shiporder" contm trs elementos filhos diferentes: "orderperson", "shipto" e "item". O elemento "item" aparece duas vezes e contm um elemento "title", um elemento opcional "note", um elemento "quantity" e um "price". A linha acima: xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" diz ao parser XML que o documento deve ser vlidado por um esquema. A linha: xsi:noNamespaceSchemaLocation="shiporder.xsd" especifica ONDE o esquema reside (no caso, ele est no mesmo diretrio que "shiporder.xml").

Crie um XML Schema


Agora ns vamos criar um esquema para o documento XML acima! Ns comeamos abrindo um novo arquivo que chamaremos "shiporder.xsd". Para criar o esquema ns podemos simplesmente seguir a estrutura no documento XML e definir cada elemento a medida que o encontramos. Ns vamos comear com a declarao XML padro, seguida do elemento xs:schema que define um esquema:

<?xml version="1.0" encoding="ISO-8859-1" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

...

...

</xs:schema>

No esquema acima ns usamos o namespace padro (xs), e a URI associada com este namespace na linguagem de definio Schema, que tem o valor padro http://www.w3.org/2001/XMLSchema. Em seguida, ns temos que definir o elemento "shiporder". Este elemento tem um atributo e contm outros elemento, assim o consideramos um tipo complexo. Os elementos filhos de "shiporder" so englobados por um elemento xs:sequence que define uma ordem para eles:

<xs:element name="shiporder"> <xs:complexType> <xs:sequence> ... ... </xs:sequence> </xs:complexType> </xs:element> Ento ns temos que definir o elemento "orderperson" como um tipo simples (porque ele no contm nenhum atributo ou elemento). O tipo (xs:string) prefixado com o prefixo do namespace associado ao XML Schema que indica um tipo de dado pr-definido: <xs:element name="orderperson" type="xs:string"/> Em seguida, ns temos que definir dois elementos que so do tipo complexo: "shipto" e "item". Ns comeamos definindo o elemento "shipto":

<xs:element name="shipto"> <xs:complexType> <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name="address" type="xs:string"/> <xs:element name="city" type="xs:string"/> <xs:element name="country" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> Com esquemas ns podemos definir o nmero possvel de ocorrncias de um elemento com os atributos maxOccurs e minOccurs. maxOccurs especifica o nmero mximo de ocorrncias para um elemento e minOccurs o nmero mnimo. O valor padro para maxOccurs e minOccurs 1!!! Agora ns podemos definir o elemento "item". Este elemento pode aparecer muitas vezes dentro do elemento "shiporder". Isto especificado definindo o atributo maxOccurs do elemento "item" para "unbounded" que significa que podem haver tantas ocorrncias do elemento "item" quanto o autor desejar. Note que o elemento "note" opcional. Ns especificamos isto definindo o atributo minOccurs em zero:

<xs:element name="item" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="title" type="xs:string"/> <xs:element name="note" type="xs:string" minOccurs="0"/> <xs:element name="quantity" type="xs:positiveInteger"/> <xs:element name="price" type="xs:decimal"/> </xs:sequence> </xs:complexType> </xs:element> Agora ns podemos declarar o atributo do elemento "shiporder". Como ele um atributo obrigatrio ns especificamos use="required". Nota: As declaras de atributos sempre devem vir no final: <xs:attribute name="orderid" type="xs:string" use="required"/> Aqui est a listagem completa do arquivo schema chamado "shiporder.xsd":

<?xml version="1.0" encoding="ISO-8859-1" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="shiporder"> <xs:complexType> <xs:sequence> <xs:element name="orderperson" type="xs:string"/> <xs:element name="shipto"> <xs:complexType> <xs:sequence> type="xs:string"/> type="xs:string"/> <xs:element name="city" type="xs:string"/> type="xs:string"/> <xs:element name="country" </xs:sequence> </xs:complexType> </xs:element> <xs:element name="item" maxOccurs="unbounded"> <xs:element name="name" <xs:element name="address"

<xs:complexType> <xs:sequence> <xs:element name="title" type="xs:string"/> minOccurs="0"/> <xs:element name="note" type="xs:string"

<xs:element name="quantity" type="xs:positiveInteger"/> type="xs:decimal"/> <xs:element name="price" </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> <xs:attribute name="orderid" type="xs:string" use="required"/> </xs:complexType> </xs:element>

</xs:schema>

Divida o schema
O mtodo de design anterior muito simples, mas pode ser muito difcil de ler e manter quando os documentos so complexos! O prximo mtodo de design baseado na definio de todos os elementos e atributos primeiro, e ento referenci-los usando o atributo ref. Aqui est a nova aparncia o arquivo de esquema ("shiporder.xsd"):

<?xml version="1.0" encoding="ISO-8859-1"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<!-- definio de elementos simples --> <xs:element name="orderperson" type="xs:string"/> <xs:element name="name" type="xs:string"/> <xs:element name="address" type="xs:string"/> <xs:element name="city" type="xs:string"/> <xs:element name="country" type="xs:string"/> <xs:element name="title" type="xs:string"/> <xs:element name="note" type="xs:string"/> <xs:element name="quantity" type="xs:positiveInteger"/> <xs:element name="price" type="xs:decimal"/>

<!-- definio de atributos --> <xs:attribute name="orderide" type="xs:string"/>

<!-- definio de elementos complexos --> <xs:element name="shipto"> <xs:complexType> <xs:sequence> <xs:element ref="name"/> <xs:element ref="address"/> <xs:element ref="city"/> <xs:element ref="country"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="item"> <xs:complexType> <xs:sequence> <xs:element ref="title"/> <xs:element ref="note" minOccurs="0"/> <xs:element ref="quantity"/> <xs:element ref="price"/> </xs:sequence> </xs:complexType> </xs:element>

<xs:element name="shiporder"> <xs:complexType> <xs:sequence> <xs:element ref="orderperson"/> <xs:element ref="shipto"/> <xs:element ref="item" maxOccurs="unbounded"/> </xs:sequence> <xs:attribute ref="orderid" use="required"/> </xs:complexType> </xs:element>

</xs:schema>

Usando tipos nomeados

O terceiro mtodo de design define classes e tipos, que nos permite reutilizar a definio de elementos. Isto feito nomeando os elementos simpleTypes e complexTypes, e ento apontando para eles com o atributo type do elemento. Aqui est a nova forma do arquivo de esquema ("shiporder.xsd"):

<?xml version="1.0" encoding="ISO-8859-1"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:simpleType name="stringtype"> <xs:restriction base="xs:string"/> </xs:simpleType>

<xs:simpleType name="inttype"> <xs:restriction base="xs:positiveInteger"/> <xs:simpleType>

<xs:simpleType name="dectype"> <xs:restriction base="xs:decimal"/> </xs:simpleType>

<xs:simpleType name="orderidtype"> <xs:restriction base="xs:string"> <xs:pattern value="[0-9]{6}"/> </xs:restricion> </xs:simpleType>

<xs:complexType name="shiptotype"> <xs:sequence> <xs:element name="name" type="stringtype"/> <xs:element name="address" type="stringtype"/> <xs:element name="city" type="stringtype"/> <xs:element name="country" type="stringtype"/> </xs:sequence> </xs:complexType>

<xs:complexType name="itemtype"> <xs:sequence> <xs:element name="title" type="stringtype"/> <xs:element name="note" type="stringtype"/> <xs:element name="quantity" type="inttype"/>

<xs:element name="price" type="dectype"/> </xs:sequence> </xs:complexType>

<xs:complexType name="shipordertype"> <xs:sequence> <xs:element name="orderperson" type="stringtype"/> <xs:element name="shipto" type="shiptotype"/> <xs:element name="item" maxOccurs="unbounded" type="itemtype"/> </xs:sequence> <xs:attribute name="orderid" type="orderidtype" use="required"/> </xs:complexType>

<xs:element name="shiporder" type="shipordertype"/>

</xs:schema> O elemento restriction indica que o tipo de dado derivado de um namespace de XML Schema do W3C. Assim, esse fragmento: <xs:restriction base="xs:string"/> significa que o valor do elemento ou atributo de ser uma string. O elemento restriction costuma ser mais usado para aplicar restries nos elementos. Observe as seguintes linhas do esquema acima:

<xs:simpleType name="orderidtype"> <xs:restriction base="xs:string"> <xs:pattern value="[0-9]{6}"/> </xs:restriction> </xs:simpleType> Isto indica que o valor do elemento ou atributo deve ser uma string e deve exatamente seis caracteres e cada caracter deve ser um nmero entre 0 e 9.

Tipos de dados de string


Tipos de dados string so usados para valores que contm cadeias de caracteres.

Tipo de dado string


O tipo de dado string pode conter caracteres, quebras de linha, retornos de carro, e caracteres de tabulao. A seguir est o exemplo de uma declarao de string em um esquema:

<xs:element name="customer" type="xs:string"/> Um elemento em seu documento poderia ser assim: <customer>John Smith</customer> Ou assim: <customer> John Smith </customer>

Nota: O processador XML no vai modificar o valor se voc usar o tipo de dado string.

Tipo de dado normalizedString


O tipo de dado normalizedString derivado do tipo de dado string. Ele tambm contm caracteres, mas o processador XML vai removar quebras de linha, retornos de carro, e caracteres de tabulao. A seguir est um exemplo de declarao de normalizedString em um esquema: <xs:element name="customer" type="xs:normalizedString"/> Um element em seu documento poderia ser assim: <customer>John Smith</customer> Ou assim: <customer>John Smith</customer> Nota: No exemplo acima, o processador XML vai substituir a tabulao por espaos.

Tipo de dado token


O tipo de dado token tambm derivado do tipo de dado string. Ele tambm contm caracteres, mas o processador XML vai remover quebras de linha, retornos de carro, tabulao, espaos iniciais e finais, e espaos mltiplos. A seguir est um exemplo de declarao token em um esquema: <xs:element name="customer" type="xs:token"/> Um elemento em seu documento poderia ser assim: <customer>John Smith</customer> Ou assim: <customer> John Smith </customer>

Nota: No exemplo acima o processador XML vai removar a tabulao.

Tipos de dados string


Name ENTITIES Description

ENTITY ID IDREF IDREFS language Name NCName NMTOKEN NMTOKENS normalizedString QName string token Uma cadeia de caracteres Um string que no contm quebras de linhs, retornos de carro, tabulao, espaos iniciais e finais, ou mltiplos espaos Uma string que no contm quebras de linha, retornos de carro, ou tabulao Uma string que representa o atributo NMTOKEN em XML (usado apenas com atributos schema) Uma string que contm a id de uma linguagem vlida Uma string que contm um nome XML vlido Uma string que representa o atributo ID em XML (usado apenas com atributos de schema) Uma string que representa o atributo IDREF em XML (usado apenas com atributos schema)

Restries em tipos de dados string


Restries que podem ser usados com tipos de dados string: enumeration lenght maxLength minLenght pattern (NMTOKENS, IDREFS, e ENTITIES no podem usar esta restrio) whiteSpace

Tipos de dados de data e hora


Tipos de dados de data e hora so usados para valores que contm data e hora.

Tipo de dado date


O tipo de dado date usado para especificar uma data. A data especificada da seguinte forma "YYYY-MM-DD", onde: YYYY indica o ano MM indica o ms DD indica o dia

Nota: Todos componentes so obrigatrios! A seguir est um exemplo de declarao uma data em um schema:

<xs:element name="start" type="xs:date"/> Um elemento em seu documento poderia ser assim: <start>2002-09-24</start>

Time zones
Para especificar um time zone (fuso horrio), voc pode usar uma data no horrio UTC adicionando um "Z" depois da data, como aqui: <start>2002-09-24Z</start> ou voc pode especificar uma rea do horrio UTC adicionando um horrio positivo ou negativo depois da data, como aqui:

<start>2002-09-24-06:00</start>

ou

<start>2002-09-24+06:00</start>

Tipo de dado time


O tipo de dado time usado para especificar um horrio. O horrio especificado da seguinte forma "hh:mm:ss", onde: hh indica a hora mm indica os minutos ss indica os segundos

Nota: Todos componentes so obrigatrios! A seguir est um exemplo de declarao de um time em em schema: <xs:element name="start" type="xs:time"/> Um elemento em seu documento poderia ser assim: <start>09:00:00</start> Ou assim: <start>09:30:10.5</start>

Time zones
Para especificar um time zone (fuso horrio), voc pode tanto usar um horrio em UTC, adicionando um "Z" ao final dele, como aqui: <start>09:30:10Z</start> ou especificando uma rea do horrio UTC, adicionando um horrio positivo ou negativo depois dele, como aqui:

<start>09:30:10-06:00</start>

ou

<start>09:30:10+06:00</start>

Tipo de dado dateTime


O tipo de dado dateTime usado para especificar uma data e um horrio. O dateTime especificado da seguinte forma "YYY-MM-DDThh:mm:ss", onde: YYYY indica o ano MM indica o ms DD indica o dias T inidica o incio da seo obrigatria time hh indica a hora mm indica os minutos ss indica os segundos

Nota: Todos componentes so obrigatrios! A seguir est um exemplo de uma declarao dateTime em um schema: <xs:element name="stardate" type="xs:dateTime"/> Um elemento em seu documento poderia ser assim: <startdate>2002-05-30T09:00:00</startdate> Ou assim: <startdate>2002-05-30T09:30:10.5</startdate>

Time zones
Para especificar um time zone (fuso horrio), voc pode tanto utilizar um dateTime em UTC adicionado de um "Z", como aqui: <startdate>2002-05-30T09:30:10Z</startdate> ou especificando uma rea do horrio UTC, adicionando um horrio positivo ou negativo ao horrio, como aqui:

<startdate>2002-05-30T09:30:10-06:00</startdate>

ou

<startdate>2002-05-30T09:30:10+06:00</startdate>

Tipo de dado duration


O tipo de dado duration usado para especificar um intervalo de tempo. O intervalo de tempo especificado da seguinte forma "PnYnMnDTnHnMnS", onde: P indica o perodo (obrigatrio) nY indica o nmero de anos nM indica o nmero de meses nD indica o nmero de dias T indica o incio de uma seo de hora (obrigatrio se voc vai especificar horas, minutos ou segundos) nH indica o nmero de horas nM indica o nmero de minutos nS indica o nmero de segundos

A seguir est um exemplo de uma declarao de duration em um schema: <xs:element name="period" type="duration"/> Um elemento em seu documento poderia ser assim: <period>P5Y</period> O exemplo acima indica um perodo de cinco anos. Ou assim: <period>P5Y2M10D</period> O exemplo acima indica um perodo de cinco anos, dois meses e dez dias. Ou assim: <period>P5Y2M10DT15H</period> O exemplo acima indica um perodo de cinco anos, dois meses, dez dias e 15 horas. Ou assim: <period>PT15H</period> O exemplo acima indica um perodo de 15 horas.

Durao negativa
Para especificar uma durao negativa, insira um sinal de menos antes de P: <period>-P10D</period> O exemplo acima indica um perodo de menos 10 dias.

Tipos de dados de data e hora


Nome date Descrio Define um valor de data

dateTime duration gDay gMonth gMonthDay gYear

Define um valor de data e hora Define um intervalo de tempo Define uma parte de uma data - o dia (DD) Define uma parte de uma data - o ms (MM) Define uma parte de uma data - o ms e o dia (MM-DD) Define uma parte de uma data - o ano (YYYY)

gYearMonth Define uma parte de uma data - o ano e o ms (YYYY-MM) time Define um valor de hora

Restries em tipos de dados date


Restries que podem ser usadas com tipos de dados date: enumeration maxExclusive maxInclusive minEsclusive minInclusive pattern whiteSpace

Tipos de dados numricos


Tipos de dados decimais so usados para armazenar nmeros

Tipo de dado decimal


O tipo de dado decimal usado para especificar um valor numrico. O exemplo a seguir uma declarao de decimal em um schema: <xs:element name="prize" type="xs:decimal"/> Um elemento em seu documento poderia ser assim: <prize>999.50</prize> Ou assim: <prize>+999.5450</prize> Ou assim: <prize>-999.5230</prize> Ou assim: <prize>0</prize> Ou assim: <prize>14</prize>

Nota: O nmero mximo de dgitos decimais que voc pode especificar 18!

Tipo de dado integer


O tipo de dado integer usado para especificar um valor numrico sem um componente fracionrio. O exemplo a seguir uma declarao de um integer em um schema: <xs:element name="prize" type="xs:integer"/> Um elemento em seu documento poderia ser assim: <prize>999</prize> Ou assim: <prize>+999</prize> Ou assim: <prize>-999</prize> Ou assim: <prize>0</prize>

Tipos de dados numricos


Note que todos os tipos de dados abaixo derivam do tipo de dado Decimal (exceto ele mesmo)! Nome byte decimal int integer long negativeInteger Um inteiro 8-bit com sinal Um valor decimal Um inteiro 32-bit com sinal Um valor inteiro Um inteiro 64-bit com sinal Um inteiro contendo apenas valores negativos (..., -2, -1) Descrio

nonNegativeInteger Um inteiro contendo apenas valores no negativos (0, 1, 2, ...) nonPositiveInteger positiveInteger short unsignedLong unsignedInt unsignedShort unsignedByte Um inteiro contendo apenas valores no positivos (..., -2, -1, 0) Um inteiro contendo apenas valores positivos (1, 2, ...) Um inteiro 16-bit com sinal Um inteiro 64-bit sem sinal Um inteiro 32-bit sem sinal Um inteiro 16-bit sem sinal Um inteiro 8-bit sem sinal

Restries em tipos de dados numricos


Restries que podem ser usadas com tipos de dados numricos: enumeration fractionDigits maxExclusive maxInclusive minExclusive minInclusive pattern totalDigits whiteSpace

Tipos de dados variados


Outros tipos de dados variados so boolean, base64Binary, hexBinary, float, double, anyURI, QName, e NOTATION.

Tipo de dado boolean


O tipo de dado boolean usado para especificar um valor true (verdadeiro) ou false (falso). O exemplo a seguir uma declarao de um boolean em um schema: <xs:attribute name="disabled" type="xs:boolean"/> Um elemento em seu documento poderia ser asism: <prize disabled="true">999</prize> Nota: Valores vlidos para boolean so true, false, 1 (que indica true), e 0 (que indica false).

Tipos de dados binrios


Tipos de dados binrios so usados para expressar dados binrios. Ns temos dois tipos de dados binrios: base64Binary (dado binrio codificado em Base64) hexBinary (dado binrio codificado em hexadecimal)

O exemplo a seguir uma declarao de um hexBinary em um schema: <xs:element name="blobsrc" type="xs:hexBinary"/>

Tipo de dado anyURI


O tipo de dado anyURI usado para especificar uma URI. O exemplo a seguir uma declarao de um anyURI em um schema: <xs:attribute name="src" type="xs:anyURI"/> Um elemento em seu documento poderia ser assim:

<pic src="http://www.w3schools.com/images/smiley.gif" /> Nota: Se uma URI tem espaos, substitua-os por %20.

Tipos de dados variados


Nome anyURI base64Binary boolean double float hexBinary NOTATION QName Descrio

Restries em tipos de dados variados


Restries que podem ser usados com outros tipos de dados: enumeration (um tipo de dado Boolean no pode usar esta restrio) length (um tipo de dado Boolean no pode usar esta restrio) maxLength (um tipo de dado Boolean no pode usar esta restrio) minLength (um tipo de dado Boolean no pode usar esta restrio) pattern whiteSpace

Referncia de elementos XSD


Elementos XSD

Validador XSD
Validador XSD