You are on page 1of 46

XSDL

XML Schema Definition Language

Intro

uma linguagem de anotao, em XML, que possibilita a definio da estrutura e do tipo de dados de outros documentos XML

Substitui as DTDs

Permite maior controlo e flexibilidade sobre a definio da estrutura e do tipo de dados

Uma definio em XML Shema tambm ela um documento XML com um XSD bem conhecido e definido

Intro

XSDL
XML

Schema Definition Language

uma linguagem de definio de esquemas xml, isto , fornece os mecanismos que permitem definir, elemento, atributos, tipos de elementos, sequencias de elementos, escolhas, quantificadores, etc

XSD
XML

Schema Document

um documento XML, escrito em XSDL, que define a estrutura de um estrutura de um conjunto de documentos XML vlidos

Exemplo 0
ex0.xsd <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" > <xs:element name="Turma" type="xs:string"/> </xs:schema>

Um XSD muito simples

A associao entre o XML e o respectivo XSD feita pelo atributo xsi:noNamespaceSchemaLocation no elemento raiz

ex0.xml <?xml version="1.0" encoding="UTF-8"?> <Turma xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ex0.xsd">Turma nica</Turma>

Elementos Complexos - Exemplo


ex1.xsd
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Turma"> <xs:complexType> <xs:sequence> <xs:element name="Aluno> O valor do <xs:complexType> atributo <xs:sequence> name <xs:element name="nome" type="xs:string"/> define o <xs:element name="email" type="xs:string"/> nome do </xs:sequence> elemento </xs:complexType> XML </xs:element> <Turma > </xs:sequence> <Aluno> </xs:complexType> <nome>Ana</nome> </xs:element> <email>ana@esc.pt</email> </xs:schema> </Aluno>

Os elementos Turma e Aluno so complexos

Os elementos nome e email so simples e do tipo interno xs:string

</Turma> Um XSD que define 4 elementos e a hierarquia entre eles

Elementos Complexos

A declarao de um elemento feita com o elemento XSDL <element> A definio de um tipo complexo iniciada com elemento XSDL <complexType>

Os elementos Turma e Aluno so elementos complexos porque so composto por outros elementos. Neste caso uma sequncia (<sequence>) de elementos
<xs:element name=Aluno"> <xs:complexType> <xs:sequence>
<xs:sequence>

Define o elemento, ou se quiserem usar outra terminologia, define a marca, <Aluno>

</xs:complexType> </xs:element>

O valor do atributo name define o nome do elemento XML

Um elemento Simples no contm outros elementos

Mais frente veremos exemplos de tipos simples

Elementos Complexos

Um elemento que contenha outros elementos, ou atributos, sempre um elemento complexo Um elemento simples s pode conter texto e nunca pode conter elementos Um elemento vazio tambm um elemento complexo. um caso particular

<BR/>

Um elemento complexo pode ser definido de duas formas Definindo, implicitamente, um tipo annimo Usando o atributo type e atribuindo-lhe, como valor, o nome de um tipo definido, explicitamente, no XSD

Elementos vs Tipos - Exemplo


ex2.xsd
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:complexType name=turmaTipo" > <xs:sequence> <xs:element name="Aluno> Definio <xs:complexType> <xs:sequence> do tipo annimo <xs:element name="nome" type="xs:string"/> para o <xs:element name="email" type="xs:string"/> elemento </xs:sequence> aluno </xs:complexType> </xs:element> Definio de Definio de tipos elementos </xs:sequence> </xs:complexType> <xs:element name="Turma type=turmaTipo"/> </xs:schema>

Definio do tipo turmaTipo Definio de um tipo annimo. Note a ausncia do atributo name

Note-se que o elemento XSDL xs:element tem contedo, o qual necessrio para definir anonimamente o tipo de elemento Aluno

Note-se que o elemento XSDL xs:element vazio. Usa o atributo type para indicar qual o tipo deste elemento Turma

Tipos

O XSDL define 44 tipos internos, todos tipos simples, os quais esto associados ao espao de nomes http://www.w3.org/2001/XMLSchema, atravs do prefixo definido com xmlns
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="nome" type="xs:string"/> </xs:schema>

Adicionalmente podemos definir tipos complexos e tipos simples Os elementos so sempre definidos custa de tipos internos ou de tipos definidos. Os tipos definidos podem ser simples ou complexos A definio dos tipos pode ser implcita (tipos annimos) ou explicita

Tipos internos

O XSD define 44 tipos internos


Limites / Valores No tem limites True, false, 1, 0 No tem limites 32bits [-2147483647,2147483648] [-128, 127] No tem [-9223372036854775808, 9223372036854775807] ]-,-1] [1, ] ]-,0] [0,255] 245675, +2345, -2387664, 5.6, -0.03 6.05E3, -4.1E-3, 2, 0, -0, INF, -INF, NaN -127, 65536, 0, +9, -6 -128, 127, 0, 3, -9 906194569120, -94331716463567 -5808, +777798 -567 567 0, -7 206 Exemplo(S) Estes slides nunca mais terminam

Tipo String Boolean decimal float int byte integer long negativeInteger positiveInteger nonPositiveInteger unsignedByte

Tipos internos
Tipo anyURI date time dateTime duration Formato Um endereo absoluto ou relativo yyyy-mm-dd hh:mm:ss-hh:mm yyyy-mm-ddThh:mm:ss-hh:mm PnYnMnDTnHnMnS Exemplo(S) http://www.fe.up.pt/ 2010-05-26 13:20:00-05:00 2010-05-26T13:20:00 P1Y2M3DT5H4M5S, -P120S, P13M

Ver a lista completa em http://www.w3.org/TR/xmlschema-0/#SimpleTypeFacets

Atributos

Os atributos so declarados apenas para elementos complexos. Dito de outra forma: Um elemento com atributos um elemento complexo A declarao de atributos feita com o elemento XSDL <attribute>

Sendo os atributos parte de um elemento complexo, esta declarao ter de ocorrer, forosamente, dento do elemento XSD <complexType> Esta declarao ocorre sempre aps a definio dos elementos filho, se existirem.

Se houver mais que um atributo a ordem irrelevante

Isto um pouco estranho, visto que nos documentos XML os atributos ocorrem primeiro que os elementos filhos do mesmo elemento, mas ASSIM!!!

Isto faz todo o sentido j que em XML os atributos podem ocorrer em qualquer ordem, ao contrrio dos elementos

Atributos - exemplo
ex3.xsd
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Turma"> <xs:complexType> <xs:sequence> <xs:element name="Aluno> <xs:complexType> <xs:sequence> <xs:element name="nome" type="xs:string"/> <xs:element name="email" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> <xs:attribute name=nAlunos" type="xs:positiveInteger"/> <xs:attribute name=Ano" type="xs:positiveInteger"/> <xs:attribute name=disciplina" type="xs:string"/> </xs:complexType> </xs:element> <Turma nAlunos=20 Disciplina=II Ano=2> </xs:schema>

<Aluno>

<nome>Ana</nome> <email>ana@esc.pt</email> </Aluno> </Turma>

Atributos caso particular


ex4.xsd
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Turma"> <xs:complexType> <xs:sequence/> <xs:attribute name=nAlunos" type="xs:positiveInteger"/> <xs:attribute name=Ano" type="xs:positiveInteger"/> <xs:attribute name=disciplina" type="xs:string"/> </xs:complexType> <Turma nAlunos=20 Disciplina=II Ano=2/> </xs:element> </xs:schema>

Pode ser omitida a declarao de sequence

Um elemento que s contenha atributos um caso particular de um elemento complexo onde no existem filhos elementos nem, filhos texto

Neste caso temos uma sequencia de 0 (zero) elementos seguida da declarao de atributos A declarao <sequence> como vazia pode ser omitida e ficam s as declaraes <attribute>

Caso ainda mais particular

Um elemento vazio um caso particular de um elemento complexo onde no existem: nem filhos elementos; nem filhos atributo; nem filhos texto

Neste caso temos uma sequencia de 0 (zero) elementos seguida da NO declarao de atributos A declarao <sequence> como vazia pode ser omitida e, como no tem atributos, tambm no h lugar /s declarao/declaraes <attribute> Por isso teremos uma declarao <complexType> vazia

ex5.xsd
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Turma"> <xs:complexType/> </xs:element> <Turma/> </xs:schema>

O elemento XSDL complexType vazio

Sequencias vs Escolhas

Podemos ainda ter escolhas de sequncias, ou sequncias de escolhas Uma sequncia definida recorrendo ao elemento XSDL <sequence> Um escolha definida recorrendo ao elemento XSDL <choice> Um elemento <sequence> pode conter elementos <element>, <sequence> e <choice> Um elemento <choice> pode conter elementos <element>, <sequence> e <choice> O elemento <complexType> pode conter elementos <sequence> , <choice>, <all> ou <group> Os dois ltimos no iro ser aqui abordados mas tem o seguinte propsito

Os elementos filhos de um elemento podem ocorrer em sequncias ou por escolhas.

O <group> permite fazer uma referncia a um grupo de elementos definido algures no XSD O elemento <all> , de certa forma, o oposto do <sequence>, isto , os elementos podem ocorrer em qualquer ordem

Escolhas - Exemplo
ex6.xsd
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:complexType name=turmaTipo" > <xs:sequence> <xs:element name="Aluno> <xs:complexType> <xs:choice> <xs:element name=tel" type="xs:string"/> <xs:element name="email" type="xs:string"/> </xs:choice> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> <xs:element name="Turma type=turmaTipo"/> </xs:schema>

Neste outro caso a escolha recaiu sobre o elemento tel

Neste caso a escolha recaiu sobre o elemento email

<Turma> <Aluno> <tel>969444555</tel> </Aluno> </Turma>

<Turma> <Aluno> <email>Ana@s.pt</email> </Aluno> </Turma>

Sequncias de Escolhas - Exemplo


ex7.xsd
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:complexType name=turmaTipo" > <xs:sequence> <xs:element name="Aluno> <xs:complexType> <xs:sequence> <xs:element name=nome" type="xs:string"/> Uma sequncia de <xs:choice> um elemento <xs:element name=tel" type="xs:string"/> seguido de <xs:element name="email" type="xs:string"/> uma escolha </xs:choice > </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> <xs:element name="Turma type=turmaTipo"/> </xs:schema>

<Turma> <Aluno> <nome>Pedro</nome> <tel>969444555</tel> </Aluno> </Turma>

<Turma> <Aluno> <nome>Ana</nome> <email>Ana@s.pt</email> </Aluno> </Turma>

Quantificadores

Os quantificadores permitem especificar os nmeros mnimos e mximos de ocorrncias dos elementos das sequncias e das escolhas O atributo minOccurs define o nmero mnimo de ocorrncias

Se assumir o valor 0 (zero) o elemento pode nem ocorrer

O atributo maxOccurs define o nmero mximo de ocorrncias

Se assumir o valor unbounded o elemento pode ocorrer um nmero ilimitado de vezes

Quantificadores exemplo 1
ex8.xsd <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Turma"> <xs:complexType> O elemento <xs:sequence> email opcional <xs:element name="Aluno" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="nome" type="xs:string"/> <xs:element name="email" type="xs:string minOccurs="0"/> <xs:element name="tel" type="xs:string minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> O elemento tel pode ocorrer um </xs:element> nmero ilimitado de vezes e pode </xs:schema> nem ocorrer

Quantificadores exemplo 2
ex9.xsd <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Turma"> A sequncia pode <xs:complexType> ocorrer at 20 vezes <xs:sequence maxOccurs=20"> <xs:element name="nome" type="xs:string"/> <xs:element name="email" type="xs:string minOccurs="0"/> <xs:element name="tel" type="xs:string minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> <Turma > </xs:complexType> <nome>Ana</nome> </xs:element> 1 sequncia <email>ana@esc.pt</email> </xs:schema> <tel>969000333</tel> <tel>969000334</tel> 2 sequncia <nome>Rita</nome> <nome>Afonso</nome> 3 sequncia <tel>969777334</tel> <nome>Lusa</nome> 4 sequncia <tel>969777885</tel> </Turma>

Tipos simples

O Tipo Interno ou o Tipo Simples so utilizados para definir elementos que s contm texto. No podem conter nem atributos nem outros elementos Um atributo , sempre, de um Tipo Interno ou de um Tipo Simples Um Tipo Simples deriva, por restrio, de um Tipo Interno ou de outro Tipo Simples

Tipos simples exemplo


ex10.xsd <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name=tel"> O elemento tel uma <xs:simpleType> string com algumas <xs:restriction base=xs:string"> restries <xs:length value=9/> </xs:restriction> A nica restrio ter </xs:simpleType> <tel>123</tel> exactamente 9 </xs:element> caracteres </xs:schema> <tel>999333666</tel>

A definio de um tipo simples iniciada com elemento XSDL <simpleType>

Os tipos simples so restries


Um tipo simples uma faceta do tipo base

A restrio definida com o elemento restriction O atributo base define o tipo de dados que vai ser restringido Dentro do elemento restricion so definidas uma ou vrias restries O tipo de restrio depende do tipo de dados base

Facetas

Cada um dos 44 tipos internos tem definido quais as possveis facetas


Ver http://www.w3.org/TR/xmlschema-0/#SimpleTypeFacets

decimal

integer

Facetas\tipos length minLength maxLength pattern enumeration whiteSpace maxInclusive maxExclusive minExclusive minInclusive totalDigits fractionDigits

x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x

x x x x x

anyURI

string

float

time

date

byte

long

int

Tipos simples outro exemplo


ex11.xsd <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name=tel"> Uma restrio ter exactamente 9 <xs:simpleType> caracteres <xs:restriction base=xs:string"> Dupla <xs:length value=9/> A outra ser um padro restrio <xs:pattern value=[0-9]+/> composto apenas por dgitos de 0-9 </xs:restriction> </xs:simpleType> </xs:element> Deve ter um comprimento O carcter @ mnimo de 6 caracteres <xs:element name=mail"> <xs:simpleType> <xs:restriction base=xs:string"> Deve ter um comprimento mximo de 128 caracteres <xs:minLength value=6/> Tripla restrio <xs:maxLength value=128/> <xs:pattern value=.+@.+\.[a-z]{2,4}/> O ltimo carcter deve de </xs:restriction> ocorrer entre 2 e 4 vezes </xs:simpleType> Qualquer </xs:element> Qualquer carcter carcter entre a e z </xs:schema> O carcter anterior Um padro descrito com O prximo carcter para deve ocorrer pelo uma Expresso Regular ser interpretado literalmente menos uma vez

Elementos/Tipos Complexos de Contedo simples

So elementos com atributos, cujo contedo no integra outros elementos (contedo simples) Um complexType tambm pode ser definido custa de um simpleContent

Um simpleContent sempre uma extenso (extension) de um tipo Interno ou Simples

Elementos/Tipos Complexos de Contedo simples exemplo


ex12.xsd <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> O elemento de contedo simples <xs:element name=tel"> <xs:complexType> Os elementos de <xs:simpleContent> contedo simples <xs:extension base=xs:string"> so sempre uma <xs:attribute name=rede" type="xs:string"/> extenso de um tipo </xs:restriction> simples ou interno <xs:simpleContent> Se o elemento </ xs:complexType> complexo, e de </xs:element> contedo simples, <tel rede=PT>235969106</tel> </xs:schema> ser sempre uma extenso composta por um ou mais atributos Contedo simples

Tipos Complexos derivados

Os tipos complexos podem ser derivados, por extenso, de tipos complexos A ideia definir tipos bastantes e globais e depois fazer especializaes para cada caso particular A vantagem a melhor manuteno de um XSD e a maior coerncia que se obtm uma aproximao mais orientada a objectos Para se derivar um tipo usa-se o elemento XSDL extension com o atributo base a referenciar um tipo complexo

Tipos Complexos derivados - Exemplo


Ex13.xsd
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> Definido no <xs:complexType name=pessoa" > tipo base <xs:sequence> <xs:element name="email" type="xs:string"/> </xs:sequence> <xs:attribute name="nome" type="xs:string"/> Definido no </xs:complexType> Este elemento tipo derivado <xs:element name="Aluno> de contedo <xs:complexType> complexo <xs:complexContent> <xs:extension base=pessoa"> Aos elementos <xs:sequence> definidos na base adicionado esta <xs:element name=curso type="xs:string"/> sequncia de elementos </xs:sequence> <xs:attribute name=codigo" type="xs:string"/> E este atributo </xs:extension> </xs:complexContent> <Aluno nome="ana" codigo="a0123"> <email>yyy</email> </xs:complexType> <curso>lci</curso> </xs:element> </Aluno> </xs:schema>

Exemplo completo
<?xml version="1.0" encoding="UTF-8"?> O tipo pessoa <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> tem contedo <xs:complexType name="pessoa"> simples <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="tel" type="telefone"/> </xs:extension> Os elementos </xs:simpleContent> do tipo pessoa </xs:complexType> tm atributo tel <xs:complexType name="aluno"> <xs:complexContent> <xs:extension base="pessoa"> <xs:attribute name="curso" type="xs:string"/> </xs:extension> <escola> </xs:complexContent> <aluno tel="999333666" curso="LCI">Rita </xs:complexType> </aluno> <xs:simpleType name="telefone"> <aluno tel="999444666" curso="MIEIC">Paulo <xs:restriction base="xs:string"> </aluno> <xs:length value="9"/> <aluno tel="999555666" curso="MIEEC>Rosa </xs:restriction> </aluno> </xs:simpleType> <docente tel="254333666" >Pedro <xs:element name="escola"> </docente> <xs:complexType> <funcionario tel="222333666">Pedro <xs:sequence> </funcionario></escola> <xs:element name="aluno" type="aluno" maxOccurs="unbounded"/> <xs:element name="docente" type="pessoa" maxOccurs="unbounded"/> <xs:element name="funcionario" type="pessoa" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> Os elementos do tipo </xs:element> aluno tm atributo curso </xs:schema>

ex14.xsd

Atributos obrigatrios ou opcionais

Na declarao dos atributos se nada for referido estes so opcionais O atributo XSDL use pode assumir quer o valor optional quer o valor required explicitando desta forma se o atributo opcional ou obrigatrio
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> O atributo nAlunos opcional por omisso <xs:element name="Turma"> <xs:complexType> <xs:attribute name=nAlunos" type="xs:positiveInteger"/> <xs:attribute name=Ano" type="xs:positiveInteger use=opcional"/> <xs:attribute name=disciplina" type="xs:string use=required"/> </xs:complexType> <Tuma nAlunos=20" Ano="2 disciplina=II"/> </xs:element> </xs:schema> <Tuma disciplina="/>

ex15.xsd

O atributo disciplina tem de estar sempre presente. Se no existirem dados coloca-se o valor nulo, isto , uma string vazia

Elementos/Atributos por referncia

Elementos/Atributos que sejam repetidos podem ser declarados por referncia a um elemento/atributo definido globalmente no XSD O atributo XSDL ref pode ser usado para fazer referncia a um elemento/atributo global
ex16.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name=Pessoa"> <xs:complexType> <xs:sequence> Definio local do elemento <xs:element name=nome" type="xs:string"/> <xs:element ref="mail" maxOccurs=5"/> Declarao do elemento </xs:sequence> Os quantificadores </xs:element> so definidos na Este elemento diz-se <xs:element name=mail"> declarao e no na <xs:simpleType> global porque est definio global <xs:restriction base=xs:string"> definido no <xs:pattern value=.+@.+\.[a-z]{2,4}/> elemento raiz e no </xs:restriction> dentro de um tipo </xs:simpleType> ou um outro </xs:element> elemento </xs:schema>

Contedos mistos

Um elemento complexo pode conter texto intercalado com elementos, ou vice versa.

Tais elementos so ditos mistos Definem-se na declarao do tipo complexo usando o atributo XSDL mixed com o valor true no elemento XSDL complexType.

Por omisso este valor false

ex17.xsd

<?xml version="1.0" encoding="UTF-8"?> Este elemento pode <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> conter outros elementos <xs:element name=Grupo"> intercalados por texto <xs:complexType mixed=true"> <xs:choice maxOccurs =unbounded minOccurs=0"> <xs:element name=aluno" type="xs:string"/> <xs:element name=aluna" type="xs:string"/> </xs:choice> <Grupo>Sem dvida um excelente trabalho, mas nota-se </xs:complexType> a liderana da <aluna>Ana</aluna> e bem secundada </xs:element> pelo <aluno>Pedro</aluno>. O <aluno>Lus</aluno> </xs:schema> raramente participou</Grupo>

Chaves

As chaves permitem criar identificadores para conjuntos de elementos.

Na declarao de um elemento pode-se definir as suas chaves com o elemento XSDL key Este elemento composto por dois elementos

Selector que define os conjuntos de elementos Field que define para o conjunto de elemento qual campo (elemento, atributo, texto) que chave.

Podem ser definidos vrios campos

Os campos chave tem obrigatoriamente de estar presentes e serem nicos dentro do conjunto para o qual foram definidos

Chaves exemplo 1
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:complexType name="aluno"> <xs:sequence> <Escola> <xs:element name="nome" type="xs:string"/> <Alunos> <xs:element name="codigo" type="xs:string"/> <Turma> </xs:sequence> <Aluno> Estes dois elementos </xs:complexType> <nome>Snia</nome> devem ter valores <xs:complexType name="turma"> <codigo>ci007</codigo> distintos entre si <xs:sequence> </Aluno> <xs:element name="Aluno" type="aluno" maxOccurs="20"/> <Aluno> </xs:sequence> <nome>Sofia</nome> </xs:complexType> <codigo>ci008</codigo> <xs:complexType name="alunos"> </Aluno> <xs:sequence> <xs:element name="Turma" type="turma" maxOccurs="10"> </Turma> <Turma> <xs:key name="k1"> No h qualquer problema <Aluno> <xs:selector xpath="Aluno"/> em terem o mesmo valor <nome>Serafim</nome> <xs:field xpath="codigo"/> pois so de elementos <codigo>ci009</codigo> </xs:key> Turma distintos </Aluno> </xs:element> </xs:sequence> <Aluno> Estes dois elementos </xs:complexType> <nome>Sofia</nome> devem ter valores <xs:complexType name="escola"> <codigo>ci008</codigo> distintos entre si <xs:sequence> </Aluno> <xs:element name="Alunos" type="alunos"/> </Turma> </xs:sequence> </Alunos> </xs:complexType> </Escola> <xs:element name="Escola" type="escola"/> </xs:schema>

ex18.xsd

Chaves exemplo 2
ex19.xsd
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:complexType name="inscrio"> <xs:attribute name="disciplina" use="required" type="xs:token"/> <xs:attribute name="aluno" use="required" type="xs:token"/> </xs:complexType> <xs:complexType name="incries"> <xs:sequence> <xs:element name="Inscrio" type="inscrio" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> <xs:element name="Inscries" type="incries"> <xs:key name="k"> <xs:selector xpath="Inscrio"/> A chave constituda <xs:field xpath="@disciplina"/> pelo par disciplina/aluno <xs:field xpath="@aluno"/> </xs:key> </xs:element> </xs:schema> <Inscries > <Inscrio disciplina="II" aluno="ci0056"/> <Inscrio disciplina=LTW" aluno="ci0056"/> <Inscrio disciplina=ORI" aluno="ci0057"/> <Inscrio disciplina=LTW" aluno="ci0057"/> </Inscries>

O mesmo aluno mas disciplinas diferentes A mesma disciplina mas alunos diferentes

Unicidade

Por vezes no precisamos de chaves mas apenas de garantir que os campos assumem valores nicos.

Uma chave obriga o campo a existir, a unicidade no. Isto , a chave mais restritiva que a unicidade Na declarao de um elemento pode-se definir as suas unicidades com o elemento XSDL unique Este elemento composto por dois elementos

Selector que define os conjuntos de elementos Field que define para o conjunto de elemento qual campo (elemento, atributo, texto) que nico.

Podem ser definidos vrios campos

Unicidade - exemplo
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:complexType name="aluno"> <xs:sequence> <xs:element name="nome" type="xs:string"/> <xs:element name=email" type="xs:string minOccurs=0"/> </xs:sequence> </xs:complexType> <xs:complexType name="turma"> <xs:sequence> <xs:element name="Aluno" type="aluno" maxOccurs="20"/> </xs:sequence> </xs:complexType> <Escola> A unicidade no <xs:complexType name="alunos"> obriga ocorrncia <Alunos> <xs:sequence> do email <Turma> <xs:element name="Turma" type="turma> <Aluno> <xs:unique name="k1"> <nome>Snia</nome> <xs:selector xpath="Aluno"/> </Aluno> <xs:field xpath=email"/> <Aluno> </xs:key> Estes dois elementos <nome>Sofia</nome> </xs:element> no podem ter o <email>sof@feup.pt</email> </xs:sequence> mesmo contedo </Aluno> </xs:complexType> <Aluno> <xs:complexType name="escola"> <nome>Sofia</nome> <xs:sequence> <email>sofia@feup.pt</email> <xs:element name="Alunos" type="alunos"/> </Aluno> </xs:sequence> </Turma> </xs:complexType> <xs:element name="Escola" type="escola"/> </Escola> </xs:schema>

ex20.xsd

Referncias

Uma referncia restringe o valor do campo lista de todos os valores de uma dada chave

Na declarao de um elemento pode-se definir as suas referncias com o elemento XSDL keyref O atributo XSDL refer identifica a chave referenciada Este elemento composto por dois elementos

Selector que define os conjuntos de elementos Field que define para o conjunto de elemento qual campo (elemento, atributo, texto) que referencia a chave.

Podem ser definidos vrios campos

Referncias exemplo
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:complexType name="aluno"> <xs:sequence> A referncia no impede a <xs:element name="nome" type="xs:string"/> repetio de valores. Para <xs:element name="codigo" type="xs:string"/> isso necessrio declarar </xs:sequence> tambm unicidades </xs:complexType> <xs:complexType name="alunoRef"> <xs:attribute type="xs:token" name="cod"/> </xs:complexType> <xs:complexType name="turma"> <xs:sequence> <xs:element name="Aluno" maxOccurs="20" type="alunoRef"/> </xs:sequence> <Escola> </xs:complexType> <Aluno> <xs:complexType name="escola"> <nome>Patrcia</nome> <xs:sequence> <codigo>ei007</codigo> <xs:element name="Aluno" type="aluno" maxOccurs="unbounded"/> <xs:element name="Turma" type="turma" maxOccurs="unbounded"/> </Aluno> </xs:sequence> <Aluno> </xs:complexType> <nome>Pedro</nome> <xs:element name="Escola" type="escola"> <codigo>ei008</codigo> <xs:key name="alunoKey"> </Aluno> <xs:selector xpath="Aluno"/> <Turma> <xs:field xpath="codigo"/> <Aluno cod="ei007"/> </xs:key> <xs:keyref name="turmaRef" refer="alunoKey"> <Aluno cod="ei008"/> <xs:selector xpath="Turma/Aluno"/> <Aluno cod="ei007"/> <xs:field xpath="@cod"/> </Turma> </xs:keyref> </Escola> </xs:element></xs:schema>

ex21.xsd

Espao de Nomes

Embora j tenhamos vindo a trabalhar com espaos de nomes, nomeadamente o espao http://www.w3.org/2001/XMLSchema, onde esto definidos os elemento XSDL, todos os documentos XML definidos at agora tem sido criados no espao de nome annimo

Quando se pretende integrar dados de provenincias diversas a omisso do espao de nomes pode criar conflitos na definio das estruturas dos elementos Definindo os elementos em espaos de nomes nicos evitam-se futuros conflictos

Espaos de Nomes exemplo


Documento no espao de nomes annimo
<pessoas> <pessoa>Rute</pessoa> </pessoas>

Associao entre o prefixo j e o espao de nomes


http://www.fe.up.pt/~jvv/ex1

Documento no espao de nomes


http://www.fe.up.pt/~jvv/ex1

<j:pessoas xmlns:j="http://www.fe.up.pt/~jvv/ex1"> <j:pessoa>Rute</j:pessoa> </j:pessoas> <x:pessoas xmlns:x="http://www.fe.up.pt/~jvv/ex1"> <x:pessoa>Rute</x:pessoa> </x:pessoas> <pessoas xmlns="http://www.fe.up.pt/~jvv/ex1"> <pessoa>Rute</pessoa> </pessoas>

Documento no espao de nomes


http://www.fe.up.pt/~jvv/ex1

Documento no espao de nomes


http://www.fe.up.pt/~jvv/ex1

Declarao do espao de nomes por omisso. Neste documento os dois elementos pessoa podem coexistir e, mesmo assim, o documento pode continuar vlido, j que os elementos so de espaos de nomes diferentes, logo no h qualquer conflito

Estes 3 documentos so exactamente iguais


<j:pessoas xmlns:j=http://www.fe.up.pt/~jvv/ex1 xmlns:k="http://www.fe.up.pt/~jvv/ex2"> <j:pessoa>Rute</j:pessoa> <k:pessoa nome = Mafalada/> </j:pessoas>

Schemas para espaos de nomes


ex22.xsd
<xs:schema necessrio associar um prefixo targetNamespace="http://www.fe.up.pt/~jvv/ex1 ao espao de nomes alvo para xmlns:ex1="http://www.fe.up.pt/~jvv/ex1" se poder enderear os tipos, os xmlns:xs="http://www.w3.org/2001/XMLSchema"> elementos e os atributos globais

O tipo escola criado no espao de <xs:complexType name="escola"> nomes http://www.fe.up.pt/~jvv/ex1 <xs:sequence> <xs:element name="Aluno" type="xs:string" maxOccurs="unbounded"/> </xs:sequence> Para se enderear </xs:complexType> o tipo escola <xs:element name="Escola" type="ex1:escola"/> preciso tambm </xs:schema> indicar o espao de nomes

O espao de nomes no qual os elementos e os atributos vo ser criados declarado com o atributo XSDL targetNamespace. Quando se usa este atributo todos os tipos, todos os elementos e todos os atributos globais so criados nesse espao de nomes

Associao a um XSD
espao de nomes do elemento raiz

<Aluno>Rafael</Aluno> </ex1:Escola>

S o elemento raiz usa prefixo

Espao de nomes para os elementos do documento Note-se que para um espao de nomes annimo o atributo era xsi:noNamespaceSchemaLocation

Identificao do espao de nomes Espao de nomes para o atributo schemaLocation

Para associar um documento XML a um XML Schema definido para um espao de nomes usa-se o atributo xsi:schemaLocation o qual deve conter, separados por um espao, o respectivo namespace seguido do URL do XSD Se nada for dito no XML Schema s o elemento raiz usa prefixo. Todos os sub- elementos assumem-se desse espao de nomes

ex23.xsd

<ex1:Escola Os subxsi:schemaLocation="http://www.fe.up.pt/~jvv/ex1 ex16.xsd" elementos xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" assumem-se xmlns:ex1="http://www.fe.up.pt/~jvv/ex1"> do mesmo URL do XSD

Elementos/Atributos Qualificados

Por omisso os elementos e os atributos de um XSD, com um espao de nomes alvo, so desqualificados, isto , excepo do elemento raiz no devem incluir o prefixo. Assumem-se sempre do espao de nomes do elemento que os contm. Para se qualificar os elementos ou os atributos deve-se usar os atributos XSDL elementFormDefault para os elementos e attributeFormDefault para os atributos

Qualificao - Exemplos
ex24.xsd
<xs:schema targetNamespace="http://www.fe.up.pt/~jvv/ex1" xmlns:ex1="http://www.fe.up.pt/~jvv/ex1" xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified"> <xs:complexType name="escola"> <xs:sequence> <xs:element name="Aluno" type="xs:string/> </xs:sequence> <xs:attribute name="nome" type="xs:string"/> </xs:complexType> <xs:element name="Escola" type="ex1:escola"/> </xs:schema>

Os atributos tm de ser qualificado Os elementos tm de ser qualificados

<ex1:Escola xsi:schemaLocation="http://www.fe.up.pt/~jvv/ex1 ex17.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ex1="http://www.fe.up.pt/~jvv/ex1" ex1:nome="FEUP"> <ex1:Aluno>Rafael</ex1:Aluno> </ex1:Escola>

You might also like