Você está na página 1de 64

Linguagem XSD (XML Schema Definition)

V3

Baseado nos slides do professor Paulo Trigo Todas as alteraes so da responsabilidade do professor Antnio Tefilo e do professor Diogo Remdios
1

O que o XSD?

uma linguagem de base XML para especificar estrutura (esquema)

de outros documentos XML (instncias do esquema)

XSD e DTD (Document Type Definition) tm o mesmo objectivo

... o de especificar os blocos de construo vlidos num documento XML

O XSD uma alternativa ao DTD

... o XSD permite especificar tudo o que o DTD permite e bastante mais!

Alguns aspectos que contribuem para o interesse do XSD


suporta tipos de dados e derivao (o DTD apenas suporta texto) suporta integrao com espaos de nome (o DTD no suporta)

... e escrito em XML (o DTD tem uma sintaxe prpria)


... assim, a tecnologia XML aplica-se toda ao XSD (e.g XPath, XQuery) ganho muito importante: tratamento uniforme da estrutura e dos dados...

O que so: Esquema e Instncia?

Um esquema uma especificao formal

da estrutura que um documento vlido tem que respeitar

Um documento uma instncia de um esquema


quando a sua estrutura descrita por esse esquema ... diz-se documento instncia ou simplesmente instncia

A construo de um esquema corresponde a

escrever um (ou mais) ficheiros XSD

A construo de uma instncia corresponde a

escrever um (ou mais) ficheiros XML associado(s) a ficheiro(s) XSD

Documento XML: bem formado e vlido

Um documento XML diz-se bem formado


se respeitar as regras da linguagem XML e.g. o valor dos atributos delimitado por aspas ou plicas, etc ... ou conforme com um esquema (schema valid) sempre que respeita (satisfaz) todas as restries do esquema ... se vlido est bem formado (o inverso pode no ser verdade) pode estar, ou no, bem formado pode estar, ou no, vlido (de acordo com a sua especificao XSD!)

Um documento XML diz-se vlido de acordo com um esquema


Note-se que uma especificao XSD tambm documento XML


H ferramentas que verificam um documento XML


e.g. o Notepad XML, o XML Spy, ... analisador na Internet em: http://www.w3.org/2001/03/webdata/xsv

Hello World em XSD e seu XML


helloWorld_1.xsd

<?xml version=1.0?> <xs:schema xmlns:xs=http://www.w3.org/2001/XMLSchema> <xs:element name=hello type=xs:string /> </xs:schema>

XSD

No ficheiro XSD necessrio declarar o namespace, http://www.w3.org/2001/XMLSchema, no qual os elementos que definem a linguagem XSD esto declarados
helloWorld_1.xml

<?xml version=1.0?> <hello xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:noNamespaceSchemaLocation=helloWorld_1.xsd> World </hello>

XML

No ficheiro xml necessrio declarar o namespace, http://www.w3.org/2001/XMLSchemainstance, no qual os atributos relativos os ficheiros XML que so instncias de ficheiros XSD.
5

Agora com namespace


helloWorld_2.xsd

<?xml version=1.0?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://helloWorld"> <xs:element name="hello" type="xs:string"/> </xs:schema>

XSD

Deve-se indicar qual o targetNamespace

helloWorld_2.xml

<?xml version=1.0?> <n:hello xmlns:n=http://helloWorld xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://helloWorld helloWorld_2.xsd> World </n:hello>

XML

Tem de se utilizar o atributo schemaLocation e indicar pares de namespace ficheiro.xsd. Pode-se declarar prefixos para os namespaces utilizados.
6

Mas qual o formato geral de um esquema?

Um esquema (XSD) um documento XML

portanto, tem um elemento raiz e pode ter uma declarao XML Esse elemento e os todos os outros elementos XSD tm de ser prefixados com o namespace: http://www.w3.org/2001/XMLSchema

O elemento raiz de um esquema o elemento <schema>

usual utilizar-se o prefixo xs para esse namespace

Diz-se que um elemento global quando


descendente imediato do elemento schema Caso haja mais que um elemento global, ento o ficheiro XML pode iniciar-se com qualquer um deles em alternativa descendente imediato de um elemento diferente de schema

Diz-se que um elemento local quando

Um ficheiro XML para ter referncia ao seu esquema XSD:

Tem de declarar o namespace http://www.w3.org/2001/XMLSchemainstance, normalmente sob o prefixo de xsi, e No elemento declarar o atributo xsi:schemaLocation ou xsi:noNamespaceSchemaLocation a indicar a localizao do ficheiro XSD
7

Schema com vrios elementos globais


helloWorld_3.xsd

<?xml version=1.0?> <xs:schema xmlns:xs=http://www.w3.org/2001/XMLSchema> <xs:element name=hello type=xs:string /> <xs:element name=ola type=xs:string /> </xs:schema>

XSD

Caso o schema tenha vrios elementos globais, eles podem ser utilizados em alternativa como elemento inicial dos ficheiros XML
helloWorld_3.xml

<?xml version=1.0?> <ola xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:noNamespaceSchemaLocation=helloWorld_1.xsd> World </ola>

XML
8

O elemento inicial pode ser o <Ola> ou o elemento <hello>

... e que estruturas tenho para especificar um esquema?

Posso especificar um Tipo Simples

Um elemento simples, um atributo ou uma restrio*

Posso especificar um Tipo Complexo

elemento que pode conter outros elementos, atributos e texto

... e um Tipo Complexo pode ter diversos indicadores

indicador de relao de ordem

sequence, choice, all

indicador de ocorrncia

maxOccurs, minOccurs
group name, attributeGroup name

indicador de agrupamento

* restrio um novo conceito XSD


9

... sequncia desta apresentao ...


elemento Tipo Simples atributo

1
elemento (complexType e complexContent) Tipo Complexo indicador (sequence)

Tipo Simples
2

restrio
elemento (vazio, elemento ou texto, misto)

Tipo Complexo

indicador (restantes, alm de sequence)

10

Definies Simples Os denominados Tipos simples


Definio simples de elemento (tipo simples elemento) Definio simples de atributo (tipo simples atributo) Apresentao dos tipos de dados

11

Tipo Simples: elemento

Um elemento de Tipo Simples apenas pode conter texto


no pode conter outros elementos nem atributos Sobre o texto pode-se indicar qual o tipo de seu valor

Um elemento define-se com a sintaxe (simplificada),


<xs:element name=xxx type=yyy />

Exemplo,
<xs:element name=primNome type=xs:string /> <xs:element name=idade type=xs:integer /> <xs:element name=dataNasc type=xs:date />

xs:string xs:decimal xs:integer xs:boolean xs:date xs:time ...

definies XSD elementos XML

<primNome>Miguel</primNome> <idade>10</idade> <dataNasc>1997-03-27</dataNasc>

12

Tipo Simples: elemento (sintaxe mais completa)


<xs:element name = XMLname type = QName default = string fixed = string nillable = (true | false) block = (#all | extension | restriction | substitution) maxOccurs = (nonNegativeInteger minOccurs = nonNegativeInteger | unbounded) QName Qualified Name (nome qualificado)

valor omisso valor fixo valor nulo (xsi:nil)


um atributo

ref = QName
substitutionGroup = QName> </xs:element>

no permite a construo indicada (#all no permite nenhuma) Restries*

referncia ao elemento de uma outra declarao de topo, e substituio de elementos *


Default: minOccurs = maxOccurs = 1 Rule: minOccurs <= maxOccurs

* a ver posteriormente
13

... exemplo (o XSD e o XML) de tipo simples: elemento


<?xml version=1.0 encoding=UTF-8?> <xs:schema xmlns:xs=http://www.w3.org/2001/XMLSchema> <xs:element name=lista_dataNascimento> <xs:complexType> <xs:sequence> <xs:element name=dataNascimento type=xs:date nillable=true minOccurs=1 maxOccurs=unbounded/> </xs:sequence> </xs:complexType> </xs:element>

especificao do elemento
(o resto ser visto posteriormente)

</xs:schema>
exemplo_elemento_v01.xsd

... e um documento XML


<?xml version=1.0 encoding=ISO-8859-1 standalone=yes?> <lista_dataNascimento xmlns:xsi=http://www.w3.org/2001/XMLSchema -instance xsi:noNamespaceSchemaLocation=exemplo_elemento_v01.xsd> <dataNascimento>2007-01-31</dataNascimento> <dataNascimento xsi:nil=true></dataNascimento> </lista_dataNascimento>

elemento nulo elemento vazio

elemento vazio <dataNascimento/>


14

exemplo_elemento_v01.xml

Tipo Simples: atributo


Um atributo sempre declarado como Tipo Simples Um atributo define-se com a seguinte sintaxe (simplificada):
<xs:attribute name=xxx type=yyy />
xs:string xs:decimal xs:integer xs:boolean xs:date xs:time ...

Exemplo,

<xs:attribute name=lingua type=xs:string />

definies XSD

<primNome lingua=PT>Miguel</primNome>

elementos XML

15

Tipo Simples: atributo (sintaxe mais completa)

<xs:attribute name = XMLname type = QName default = string fixed = string use = (optional | prohibited | required) ref = QName> </xs:attribute>

valor omisso

valor fixo
valor opcional, proibido ou obrigatrio

referncia ao atributo de uma outra declarao de topo

16

... exemplo de tipo simples: atributo


<?xml version=1.0 encoding=UTF-8?> <xs:schema xmlns:xs=http://www.w3.org/2001/XMLSchema> <xs:element name=lista_dataNascimento> <xs:complexType> <xs:sequence> <xs:element name=dataNascimento maxOccurs=unbounded>

<xs:complexType>
<xs:attribute name=data" type=xs:date use=required/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType>

especificao do atributo (o resto ser visto posteriormente)

</xs:element></xs:schema>
exemplo_atributo_v01.xsd

... e um documento XML

<?xml version=1.0 encoding=ISO-8859-1 standalone=yes?> <lista_dataNascimento xmlns:xsi=http://www.w3.org/2001/XMLSchema -instance xsi:noNamespaceSchemaLocation=exemplo_atributo_v01.xsd> <dataNascimento data=2007-01-31/> <dataNascimento data=2000-12-31/> </lista_dataNascimento> exemplo_atributo_v01.xml 17

atributo obrigatrio

Atributo REF
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:attribute name="data" type="xs:date"/> <xs:element name="dataNascimento"> <xs:complexType> <xs:attribute ref="data" use="required"/> </xs:complexType> </xs:element> <xs:element name="lista_dataNascimento"> <xs:complexType> <xs:sequence> <xs:element ref="dataNascimento" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> exemplo_ref_1.xsd

Exemplo da declarao: - de um elemento que refere outro - de um atributo refere outro Entenda-se que REF faz com que o presente elemento/atributo incorpore as definies do elemento/atributo referenciado

<?xml version=1.0 encoding=ISO-8859-1 standalone=yes?> <lista_dataNascimento xmlns:xsi=http://www.w3.org/2001/XMLSchema -instance xsi:noNamespaceSchemaLocation=exemplo_ref_1.xsd> <dataNascimento data=2007-01-31/>

<dataNascimento data=2000-12-31/>
</lista_dataNascimento> SI1 - 12 exemplo_ref_1.xml 18

Tipo de dados: string (e tipos derivados)

string pode conter

qualquer alfanumrico, tabulador, fim de linha ou mudana de linha

normalizedString (deriva de string)

uma string, mas cujo valor substitui os caracteres: tabulador; fim de linha; e mudana de linha, por um espao

token (deriva de string)

uma normalizedString mas que substitui os mltiplos espaos por um s espao e elimina os espaos iniciais e finais enumeration, length, maxLength, minLength, pattern, whiteSpace

Restries sobre string


... posteriormente se ver como concretizar a derivao de tipos...


19

Tipo de dados: date, time, dateTime e period

date pode conter uma data

no formato: YYYY-MM-DD (todos obrigatrios)


no formato: hh:mm:ss (todos obrigatrios) formato: YYYY-MM-DDThh:mm:ss (todos obrigatrios) e.g. <inicioAlmoco>2007-01-01T13:30:00</inicioAlmoco> formato: PnYnMnDTnH:nM:nS e.g. <cozedura>PT30M</cozedura> (meia hora) e.g. <inverno>P3M</inverno> (trs meses) enumeration, maxExclusive, maxInclusive, minExclusive, minInclusive, pattern, whiteSpace

time pode conter um instante dentro das 24 horas do dia

dateTime pode conter um instante de tempo


duration pode conter uma durao de tempo (n um natural)


Restries sobre estes tipos de dados


20

Tipo de dados: decimal (e tipos derivados)

decimal pode conter numrico (mximo 18 dgitos decimais)


e.g. <precoSaldo>29.50</precoSaldo> e.g. <diferenca>-2.50</diferenca>

integer pode conter inteiro (deriva de decimal)


e.g. <idade>29</idade> e.g. <diferenca>-2</diferenca>

... outros tipos derivados de decimal


tipos com sinal: byte(8), short(16), int(32), long(64) tipos sem sinal: unsignedByte(8), , unsignedLong(64) tipos sem limite: integer (com sinal), negativeInteger, nonNegativeInteger, positiveInteger, nonPositiveInteger

Restries sobre estes tipos de dados


enumeration, fractionDigits, maxExclusive, maxInclusive, minExclusive, minInclusive, pattern, totalDigits, whiteSpace


(16): Dimenso de 16 bits
21

... outros tipos de dados

boolean pode conter true ou false


e.g. xsd: <xs:attribute name=emVigor type=xs:boolean/> e.g. xml: <precoSaldo emVigor=false>29.50</precoSaldo> e.g. xsd: <xs:attribute name=imagem type=xs:anyURI/> e.g. xml: <precoSaldo imagem=./a.gif>29.50</precoSaldo> ... nota: num URI os espaos em branco representam-se por %20 e.g. xsd: <xs:attribute name=message= type=xs:QName/> e.g. xml: <send message=ns1:message1/> ... notar que um nome qualificado pode, ou no, ser prefixado:

anyURI pode conter um qualquer URI


QName pode conter um qualquer nome qualificado


se for prefixado, ento o prefixo est associado a namespace se no for prefixado, ento o nome ocorre no mbito local

Floating point types

xs:float, IEEE 32-bit floating-point

valores: 123.456, +1234.456, -1.2344e56, -.45E-6, INF, -INF, e NaN

xs:double, IEEE 64-bit floating-point

22

Tipo complexo

Um tipo que pode ter um contedo mais complexo

23

Tipo Complexo: o nome original e usual de uma receita!

Um Tipo Complexo
composto por dois Tipos Simples

receita nomeOriginal nomeUsual

Tipo Simples
24

Tipo Complexo

Um elemento de Tipo Complexo pode conter

outros elementos e/ou atributos


elementos filho tm que seguir ordem de declarao

<xs:element name=receita> <xs:complexType> <xs:sequence>

1 2

<xs:element name=nomeOriginal type=xs:string/> <xs:element name=nomeUsual type="xs:string/> </xs:sequence>

</xs:complexType> </xs:element> <receita> <nomeOriginal>Sumeshi</nomeOriginal> <nomeUsual>Arroz de Sushi</nomeUsual> </receita>


receita_v02.xml receita_v02.xsd

Nota: Falta adicionar headers


25

Tipo Complexo com elementos e atributos

A declarao de atributos deve aparecer aps a declarao dos elementos


<xs:element name=receita> <xs:complexType> <xs:sequence> <xs:element name=nomeOriginal type=xs:string/> <xs:element name=nomeUsual type="xs:string/> </xs:sequence> <xs:attribute name="nomeInterno" type="xs:string"/> <xs:attribute name="dataColocacao" type="xs:date"/> </xs:complexType> </xs:element>
receita_v02_0.xsd

<receita nomeInterno=SUMESHI-01 dataColocacao=2008-12-31> <nomeOriginal>Sumeshi</nomeOriginal> <nomeUsual>Arroz de Sushi</nomeUsual> </receita>


receita_v02_0.xml 26

Tipo Complexo (definir com nome)

... limitao da soluo anterior: o Tipo Complexo era annimo

apenas o elemento receita podia usar o Tipo Complexo especificado

Outra soluo

dar um nome, e.g. tReceita, ao Tipo Complexo a receita um elemento simples do tipo tReceita ... e qualquer outro elemento pode usar o tipo tReceita
<xs:element name=receita type=tReceita/> <xs:element name="receita2" type="tReceita"/> <xs:complexType name=tReceita> <xs:sequence>

<xs:element name=nomeOriginal type=xs:string/>


<xs:element name=nomeUsual type="xs:string/> </xs:sequence> </xs:complexType>
receita_v02_1.xsd 27

Tipo Complexo estendido

A boa prtica da reutilizao por derivao consegue-se

estendendo um Tipo Complexo (e.g. para conter um novo elemento)


<xs:element name=receita type=tReceitaComData/> <xs:complexType name=tReceita> <xs:sequence>

base

<xs:element name=nomeOriginal type=xs:string/> <xs:element name=nomeUsual type="xs:string/> </xs:sequence> </xs:complexType> <xs:complexType name=tReceitaComData"> <xs:complexContent> <xs:extension base=tReceita">

estende (extension), ou restringe (restriction) contedo do complexType

extension

<xs:sequence> <xs:element name=dataPub type=xs:date/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> receita_v02_2.xsd 28

Restries

29

... e novamente o Tipo Simples: a noo de restrio

Um Tipo Simples (elemento ou atributo) pode ter valores


que por sua vez podem estar sujeitos a restries e.g. a idade tem valor inteiro compreendido entre 0 e 130 (ser?!)

Uma restrio define os valores admissveis para

elementos e atributos

Chama-se faceta (facet)

a uma restrio definida sobre um elemento

Uma restrio sempre um novo Tipo Simples


ou seja, no corresponde nem a um elemento nem a um atributo ... algo que se pretende impor a um elemento ou a um atributo

Uma restrio pode referir-se a

intervalo de valores, conjunto de valores e padro de valores

30

Tipo Simples faceta: intervalo de valores


restrio

O elemento idade tem valor no intervalo de 0 a 130.

... recordar: faceta uma restrio sobre um elemento

instncia vlida

<idade>10</idade>

<xs:element name=idade> <xs:simpleType> <xs:restriction base=xs:integer> <xs:minInclusive value=0/> esquema <xs:maxInclusive value=130/> </xs:restriction> </xs:simpleType> </xs:element>

uma restrio sempre um novo Tipo Simples que tem por base outro tipo

idntico a estender um tipo base aqui usa-se restriction para estender usa-se extension

31

Tipo Simples faceta: conjunto de valores


O elemento iberico apenas pode tomar os valores Portugal e Espanha.

<iberico>Portugal</iberico>

Outra soluo ... em que difere da anterior?


<xs:element name=iberico> <xs:simpleType> <xs:restriction base=xs:string> <xs:enumeration value=Portugal/> <xs:enumeration value=Espanha/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name=iberico type=tIberico/> <xs:simpleType name=tIberico> <xs:restriction base=xs:string> <xs:enumeration value=Portugal/> <xs:enumeration value=Espanha/> </xs:restriction> </xs:simpleType>

32

Tipo Simples faceta: padro de valores


Ex: O elemento acronimo tem sempre trs letras maisculas.
<xs:element name=acronimo> <xs:simpleType> <xs:restriction base=xs:string> <xs:pattern value=[A-Z][A-Z][A-Z]/> </xs:restriction> </xs:simpleType> <acronimo>IVA</acronimo> </xs:element>

O valor uma expresso regular


http://www.w3.org/TR/2004/REC-xmlschema-220041028/datatypes.html#regexs
Sequncias com significado especial . um qualquer carcter excepto \r e \n \d digito (\D no digito) \s separador (\S no separador) \p{x} caracteres com a propriedade x Propriedades: L letra Lu letra uppercase Ll letra lowercase \p{Lu}\p{Li}{5} - Manuel (\d-[A-Z]{3,6}\s){2} 2-DJF 6-DSFFD

Caracteres de controle: ? opcional * - zero ou mais vezes + - um ou mais vezes {n} precisamente n vezes {n,} pelo menos n vezes {n,m} de n a m vezes | - um ou outro [abc] a ou b ou c [a-c] valores entre a e c ^ - negao: [^A-Z] not A-Z \ - carcter de escape
Os caracteres \ | . - ^ ? * + {} () [] para serem usados por si tm de ser prefixados pelo carcter de escape. Exemplo: pattern='\[\*\]' identifica [*].

Padro/valor

->

valor vlido no padro

pattern value=([a-z])* -> amilcar pattern value=([a-z][A-Z])+ -> sToP

pattern value=([a-zA-Z0-9]){9}-> ano2009DC


pattern value=([256])+ -> 52222222 pattern value=masc|femin -> masc
33

Tipo Simples faceta: sobre espaos em branco


O elemento morada mantm espaos.
The white space characters are: spaces, line feeds, tabs and carriage returns.

<morada>Rua

de ...</morada>
... <xs:whiteSpace value=replace/>

<xs:element name=morada> <xs:simpleType> <xs:restriction base=xs:string> <xs:whiteSpace value=preserve/> </xs:restriction> </xs:simpleType> </xs:element>

Todos os white spaces so substitudos por caracteres de espao.

... <xs:whiteSpace value=collapse/>

Espaos iniciais e finais so removidos. Mltiplos espaos, e restantes white spaces, substitudos por um nico carcter de espao.

Todos os white spaces so preservados pelo processador de XML


34

Tipo Simples faceta: sobre nmero de caracteres


O elemento senha tem entre 5 e 8 caracteres.
Se forem exigidos precisamente 4 caracteres (e.g. cdigo multibanco).
... <xs:length value=4/>

<senha>aSen5ha</senha>

<xs:element name=senha> <xs:simpleType> <xs:restriction base=xs:string> <xs:minLength value=5/> <xs:maxLength value=8/> </xs:restriction> </xs:simpleType> </xs:element>

Mas o cdigo do telemvel constitudo por 4 dgitos (0 a 9).


<xs:element name="codATM"> <xs:simpleType> <xs:restriction base=xs:integer> <xs:totalDigits value=4/>

</xs:restriction>
</xs:simpleType> </xs:element>

35

Formas de tipo complexo

elemento-vazio elemento-texto elemento-elementos elemento-misto

36

Formas de Elemento de Tipo Complexo

Um elemento de Tipo Complexo pode conter

outros elementos e/ou atributos

Existem 4 formas de elemento de Tipo Complexo


elemento sem nada elemento-vazio (que apenas pode conter atributos) elemento-texto (elemento que apenas pode conter texto) elemento-elementos (que apenas pode conter outros elementos) elemento-misto (que pode conter outros elementos e texto)
so definies que geralmente se utilizam convm conhec-las pois representam construes estereotipadas elemento sem nada
<xs:element name="produto"> <xs:complexType/> </xs:element>

As 4 formas de Tipo Complexo,


produto_0.xml/xsd

37

Tipo Complexo: elemento-vazio


Um elemento-vazio apenas pode conter atributos.
recordar: indica que se pretende estender ou restringir um tipo base
... ou, de modo mais compacto
<xs:element name=produto> <xs:complexType> <xs:complexContent> <xs:restriction base=xs:anyType> <xs:attribute name=codigo type="xs:positiveInteger"/> </xs:restriction> </xs:complexContent> </xs:complexType> </xs:element> </xs:element> <xs:element name=produto> <xs:complexType> <xs:attribute name=codigo type=xs:positiveInteger/> </xs:complexType>

<produto codigo=1234/>

Tcnica: define-se um tipo que pode conter elementos, mas no se declaram quaisquer elementos!

produto.xml/xsd

produto_2.xml/xsd
38

Tipo Complexo: elemento-texto


Um elemento-texto apenas pode conter texto (e naturalmente atributos).
<codReceita origem=Japo>15</codReceita>

Um elemento s com texto:


<xs:element name="onlyTextElem"> <xs:simpleType> <xs:restriction base="xs:string"/> </xs:simpleType> </xs:element> simpleContent permite: estender ou restringir um elemento-texto ou estender ou restringir o contedo um tipo simples (aquele que no pode conter atributos; aquele que apenas pode conter texto)

<xs:element name=codReceita> <xs:complexType> <xs:simpleContent> <xs:extension base=xs:integer> <xs:attribute name=origem type="xs:string"/> </xs:extension>

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

Tcnica: define-se um tipo complexo e diz-se que o seu contedo o de um tipo simples com atributos!
39

Tipo Complexo: elemento-elementos


Um elemento-elementos apenas pode conter outros elementos (e atributos).
<receita> <nomeOriginal>Sumeshi</nomeOriginal> <nomeUsual>Arroz de Sushi</nomeUsual> </receita>

recordar: exemplo anterior

<xs:element name=receita> <xs:complexType> <xs:sequence> <xs:element name=nomeOriginal type=xs:string/> <xs:element name=nomeUsual type="xs:string/> </xs:sequence> </xs:complexType> </xs:element>

sequence permite: indicar a ordem pela qual os elementos surgem no contexto do complexType no exemplo: primeiro surge o elemento nomeOriginal depois surge o elementos nomeUsual

Tcnica: define-se um tipo que pode conter outros elementos, em determinada sequncia!
40

Tipo Complexo: elemento-misto


Um elemento-misto pode conter atributos, elementos e texto.
<receita> O <nomeOriginal>Sumeshi</nomeOriginal> usualmente designado por <nomeUsual>Arroz de Sushi</nomeUsual>. Esta receita tem cdigo

O contedo de receita contm texto analisado (parsed character data, #PCDATA) intercalado com outros elementos.

<codReceita>15</codReceita>.
</receita>

<xs:element name=receita> <xs:complexType mixed=true> <xs:sequence> <xs:element name=nomeOriginal type=xs:string/> <xs:element name=nomeUsual type="xs:string/> <xs:element name=codReceita type="xs:integer/>

mixed=true permite: colocar texto (#PCDATA) entre os elementos de um complexType no exemplo: O, usualmente designado por, . Esta receita tem cdigo, e .

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

so textos colocados entre os elementos descendentes de receita.


41

Indicadores

De ordem: sequence, choice, all De ocorrncia: maxOccurs, minOccurs De agrupamento: group, attribute group

42

Tipo Complexo: indicador

Um indicador define-se para um Tipo Complexo e permite

controlar a utilizao dos elementos em documentos instncia existem 7 indicadores (organizados em 3 grupos)

Indicador de relao de ordem

Sequence, choice, all

Indicador de ocorrncia

maxOccurs, minOccurs

Indicador de agrupamento

group name, attributeGroup name

43

Indicador de relao de ordem (sequence) e ocorrncia


sequence
elementos surgem na ordem definida; cada elemento pode surgir diversas vezes.

0 minOccurs < unbounded 0 maxOccurs unbounded

<xs:element name=receita> <xs:complexType> <xs:sequence>

<receita>

<nomeOriginal/>
<nomeUsual/> <codReceita/> </receita> <receita> <nomeOriginal/> <codReceita/> </receita>

<xs:element name=nomeOriginal type=xs:string/>


<xs:element name=nomeUsual type="xs:string minOccurs=0/> <xs:element name=codReceita type="xs:integer/> </xs:sequence> </xs:complexType> </xs:element>

Seq-choice-all.xsd
44

Indicador de relao de ordem (choice) e ocorrncia


choice
apenas pode surgir um dos elementos indicados; esse elemento pode surgir diversas vezes.

0 minOccurs < unbounded 0 maxOccurs unbounded

<xs:element name=receita> <xs:complexType> <xs:choice> <xs:element name=numeroBilheteIdentidade type=xs:string maxOccurs=unbounded/> <xs:element name=numeroInformacaoFiscal type="xs:string/> </xs:choice> </xs:complexType> </xs:element>

<receita>

<numeroBilheteIdentidade/>
<numeroBilheteIdentidade/> <numeroBilheteIdentidade/>

ou

</receita> <receita> <numeroInformacaoFiscal/> </receita>

Seq-choice-all.xsd
45

Indicador de relao de ordem (all) e ocorrncia


all
Os elementos podem surgir em qualquer ordem, mas cada elemento apenas pode surgir uma vez.
0 minOccurs 1 0 maxOccurs 1

<xs:element name=receita> <xs:complexType> <xs:all> <xs:element name=nomeOriginal type=xs:string/> <xs:element name=nomeUsual type="xs:string minOccurs=0/> <xs:element name=codReceita type="xs:integer/> <receita>

<nomeUsual/>
<codReceita/> <nomeOriginal/> </receita> <receita> <codReceita/> <nomeOriginal/> </receita>

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

Seq-choice-all.xsd
46

... indicadores XSD e construes DTD


Correspondncia entre indicadores XSD e construes DTD (Document Type Definition)

XSD xs:sequence

DTD elementos separados por vrgula, e.g. (e1, e2, e3) elementos separados por barra, e.g. (e1 | e2 | e3) no h equivalente

Descrio Sequncia ordenada de elementos. Apenas um dos elementos. Os elementos numa qualquer ordem.
47

xs:choice

xs:all

Exemplo: lista de receitas


Uma lista de receitas. Cada receita com o seu nome original e usual e lista de ingredientes.

Dado este XML que XSD o especifica?

48

Exemplo: lista de receitas (de novo o XML)


<listaDeReceitas> <receita> <nomeOriginal>Sumeshi</nomeOriginal> <nomeUsual>Arroz de Sushi</nomeUsual> <ingrediente>Arroz de gro curto (koshihikari ou nishiki)</ingrediente> <ingrediente>gua</ingrediente> <ingrediente>Vinagre de arroz</ingrediente> <ingrediente>Aucar</ingrediente> <ingrediente>Sal</ingrediente> </receita>

<receita>
<nomeOriginal>tekka-maki-sushi</nomeOriginal> <ingrediente>Alga tostada (yaki nori)</ingrediente> <ingrediente>Atum cortado em tiras</ingrediente> <ingrediente>Vinagre de arroz</ingrediente> </receita> </listaDeReceitas> XSD Construdo pelo XML Spy 2008

listaDeReceitas.xml
49

Exemplo: lista de receitas (agora um XSD)


<xs:element name=listaDeReceitas"> <xs:complexType> <xs:sequence> <xs:element name=receita maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name=nomeOriginal type=xs:string/> <xs:element name=nomeUsual type=xs:string minOccurs=0/> <xs:element name=ingrediente" type=xs:string minOccurs=1 maxOccurs=100/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType>

e.g. dois grupos: 1. nome original e usual, e 2. ingredientes.

... propor outra soluo, usando group name ...


listaDeReceitas_v01.xsd

</xs:element>

50

XSD gerado pelo XMLSpy


<?xml version="1.0" encoding="UTF-8"?> <!--W3C Schema generated by XMLSpy v2008 rel. 2 sp2 (http://www.altova.com)--> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="receita"> <xs:complexType> <xs:sequence> <xs:element ref="nomeOriginal"/> <xs:element ref="nomeUsual" minOccurs="0"/> <xs:element ref="ingrediente" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="nomeUsual"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="Arroz de Sushi"/> </xs:restriction> </xs:simpleType> </xs:element>

<xs:element name="nomeOriginal"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="Sumeshi"/> <xs:enumeration value="tekka-maki-sushi"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="listaDeReceitas"> <xs:complexType> <xs:sequence> <xs:element ref="receita" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="ingrediente"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="Alga tostada (yaki nori)"/> <xs:enumeration value="Arroz de gro curto (koshihikari ou nishiki)"/> <xs:enumeration value="Atum cortado em tiras"/> <xs:enumeration value="Aucar"/> <xs:enumeration value="Sal"/> <xs:enumeration value="Vinagre de arroz"/> <xs:enumeration value="gua"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:schema>
51

listaDeReceitas-gerado.xsd

Unicidade e Integridade

52

Restries de integridade: possvel defini-las no XSD?

Sim. O XSD permite impor, para o contexto de um documento XML,

unicidade dos valores de elementos e/ou de atributos

... designado, no modelo relacional, por integridade de entidade ... designado, no modelo relacional, por integridade referencial

garantia dos valores de elementos e/ou atributos referirem outros

Unicidade dos valores de elementos e/ou atributos

o elemento <unique> impe unicidade dos valores

... corresponde, no modelo relacional, chave candidata

o elemento <key> impe unicidade e permite ser referenciado

... corresponde, no modelo relacional, chave primria

Garantia dos valores de elementos e/ou atributos referirem outros

o elemento <keyref> impe garantia de que o valor j exista

... corresponde, no modelo relacional, chave estrangeira

53

Unicidade dos valores de elementos e/ou atributos

Uma restrio de unicidade

tem as seguintes componentes:

Definio dos elementos que devem ser avaliados


Definio dos elementos e/ou atributos de valor nico ... ambas as definies recorrem ao XPath

vlida dentro do elemento em que for declarada deve ser declarada depois de complexType/SimpleType e antes dos atributos
contexto onde a unicidade verificada elementos a analisar o atributo de valor nico
unique_1.xml

Exemplo de uma restrio de unicidade

<xs:element name="listaLocalidades"> <xs:complexType> <xs:sequence> <xs:element name="localidade" type="xs:string" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> <xs:unique name="un_localidade"> <xs:selector xpath="localidade "/> <xs:field xpath=."/> </xs:unique> unique_1.xsd </xs:element> SI1 - 12

<listaLocalidades> <localidade>Lisboa</localidade> <localidade>Lisboa</localidade> </listaLocalidades>


Erro, valor Lisboa repetido em localidade
54

Exemplo com uma lista de bares


Uma lista de bares, com cdigo de Bar nico e morada nica.
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:complexType name="CT_lista_bar"> <xs:sequence> <xs:element ref="bar" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType>

<xs:element name="lista_bar" type="CT_lista_bar"> <xs:unique name="cc_codigo"> <xs:selector xpath="bar"/> <xs:field xpath="@codigo"/> </xs:unique> <xs:unique name="cc_morada"> <xs:selector xpath="bar"/> <xs:field xpath="morada"/> </xs:unique> </xs:element> </xs:schema> <lista_bar xmlns:xsi= ... "unique_2.xsd">

<xs:element name="bar" type="CT_bar"/>


<xs:complexType name="CT_bar"> <xs:sequence> <xs:element ref="morada"/> </xs:sequence> <xs:attribute name="codigo" type="xs:string"/> </xs:complexType> <xs:element name="morada" type="xs:string"/>
unique_2.xsd SI1 - 12 Erro,

<bar codigo="O Bar Ingls"> <morada>Rua Aru</morada> </bar> <bar codigo="O Pinguim"> <morada>Rua Aru</morada> </bar> </lista_bar>
unique_2.xml
55

valor Rua Aru repetido em morada

Critrio de unicidade composto

Definio de um critrio de unicidade composto

Para cada campo que compe o critrio, utilizar um campo field em unique

Exemplo: Uma lista de bares, com cdigo de Bar e morada nicos em conjunto

No exemplo anterior ter-se-ia que eliminar os elementos unique e declarar:

<xs:unique name="cc_codigo_morada"> <xs:selector xpath="bar"/> <xs:field xpath="@codigo"/> <xs:field xpath="morada"/> </xs:unique>


unique_3.xsd

Ficheiro vlido

<lista_bar> <bar codigo="O Bar Ingls"> <morada>Rua Aru</morada> </bar> <bar codigo="O Pinguim"> <morada>Rua Aru</morada> </bar> <bar codigo="O Bar Ingls"> <morada>Rua Cames</morada> </bar> </lista_bar>
unique_3.xml 56

Integridade referencial

H integridade referencial, de um campo referenciador para um campo referenciado, quando os valores do campo referenciador existem como valores do campo referenciado

O campo referenciado, tem de ter unicidade (key ou unique) O campo referenciador (keyref) tem de indicar qual o campo que referencia

Erro, valor Manuel no <xs:complexType name="CT_lista_nomes"> existente em key_nome <xs:sequence> <xs:element name="nome" type="xs:string" maxOccurs="unbounded"/> <xs:element name="distinguido" type="xs:string" maxOccurs="unbounded"/> </xs:sequence> <lista_nomes ..."keyAndRef_1.xsd"> </xs:complexType> <xs:element name="lista_nomes" type="CT_lista_nomes"> <nome>Jos</nome> <xs:key name="key_nome"> <nome>Joo</nome> <xs:selector xpath="nome"/> <nome>Ana</nome> <xs:field xpath="."/> </xs:key> <distinguido>Jos</distinguido> <xs:keyref name="kr_distinguido" refer=key_nome"> <distinguido>Manuel</distinguido> <xs:selector xpath="distinguido"/> Nome do <xs:field xpath="."/> keyAndRef_1.xml referenciado </lista_nomes> </xs:keyref> Valores do campo </xs:element> keyAndRef_1.xsd 57 referenciador SI1 - 12

Exemplo 2: uma lista de bares, cervejas, e desses bares com essas cervejas

Pretende-se ento um ficheiro com:


Uma lista de bares Uma lista de cervejas Uma lista com quais desses bares tm essas cervejas

Tal requer integridade referencial, para garantir que s so mencionados os bares da 1 lista e as cervejas da 2 lista

<xs:complexType name="CT_lista_bar"> <xs:sequence> <xs:element name="bar" type="xs:string" maxOccurs="unbounded"/> <xs:element name="cerveja" type="xs:string" maxOccurs="unbounded"/> <xs:element name="bar_cerveja" maxOccurs="unbounded"> <xs:complexType> <xs:attribute name="oBar" type="xs:string"/> <xs:attribute name="aCerveja" type="xs:string"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> keyAndRef_2.xsd
58

Exemplo 2: declarao do elemento principal, campos nicos e declarao das referncias


<xs:element name=lista_bar_cerveja type=CT_lista_bar_cerveja> <xs:key name=cp_bar> <xs:selector xpath=bar/> <xs:field xpath=./> </xs:key> <xs:key name=cp_cerveja> <xs:selector xpath=cerveja/> <xs:field xpath=./> </xs:key> <xs:keyref name=ce_barcerveja_bar refer=cp_bar> <xs:selector xpath=bar_cerveja/> <xs:field xpath=@oBar/> </xs:keyref> <xs:keyref name=ce_barcerveja_cerveja refer=cp_cerveja> <xs:selector xpath=bar_cerveja/> <xs:field xpath=@aCerveja/> </xs:keyref> </xs:element>
keyAndRef_2.xsd 59

Tambm estaria correcto unique em vez de key

referncia para um valor de cp_bar referncia para um valor de cp_cerveja

Exemplo: ... a validao da integridade referencial


<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?> <lista_bar_cerveja xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation=keyAndRef_2.xsd"> <bar>O Bar Ingls</bar> <bar>O Pinguim</bar> <cerveja>Antarctica</cerveja> <cerveja>Bud</cerveja> <bar_cerveja oBar="O Bar Ingls" aCerveja="Antarctica"/> <bar_cerveja oBar="O Pinguim" aCerveja="Sagres"/> </lista_bar_cerveja> keyAndRef_2.xml Analisado pelo XML Spy

Erro, o valor Sagres no existente em cp_cerveja

60

Resumo: unique, key e keyref

unique

elementos e/ou atributos cujo valor tem que ser nico

key

Semelhante a unique, mas no pode ter null Assegura que o caminho referido existe, ou seja, que os elementos ou atributos referenciados existem

keyref

Indica elementos e/ou atributos cujo valor tem de existir num key ou unique referido

boa prtica os elementos keyref referenciarem elementos key

61

Consideraes finais

62

O que o XSD fornece e o que no fornece...

O XSD permite especificar


tipos de dados simples e complexos extenso de tipos restries sobre ocorrncias de elementos restries sobre valores de elementos e de atributos restries sobre unicidade dos valores de elementos e atributos restries sobre referencias entre valores de elementos e atributos especificao de estruturas compatveis com espaos de nomes

O XSD no permite especificar


entidades para utilizar em documentos XML ... de modo to simples como o DTD a estrutura do documento XML!

... por ser extremamente mais poderoso que DTD mais complexo!

63

Data types

64

Você também pode gostar