Upload
helder-da-rocha
View
197
Download
0
Embed Size (px)
Citation preview
2 ww
w.a
rgon
avis
.com
.br
Objetivos
● Este curso prático tem como finalidade explorar o XML Schema para especificar aplicações do XML e validar documentos XML que serão usados pelas aplicações
● São abordados a maior parte dos recursos do XML Schema
3 ww
w.a
rgon
avis
.com
.br
Programa
DIA 1 ● 1 Introdução ● 2 Composição e instâncias ● 3 Declaração de elementos e atributos DIA 2 ● 4 Tipos simples, uniões e listas ● 5 Tipos complexos e grupos ● 6 Extensão, restrição, substituição ● 7 Chaves e referências cruzadas DIA 3* ● 8 Programação com XML (opcional)
* verifique se está incluso no seu programa
4 ww
w.a
rgon
avis
.com
.br
Ferramentas
● É necessário ter uma ferramenta que possa ser usada para editar XML Schema e validar instâncias
● Há várias opções ● Eclipse 3.1 e Netbeans 4 (multiplataforma, gratuitos)
● JEdit 4.2 com plugins (multiplataforma, gratuito)
● oXygen XML Editor 6 (multiplataforma, ~50USD, 30 dias)
● Um editor de texto qualquer pode ser suficiente para editar esquemas, mas não para este curso
● É fundamental ter uma ferramenta capaz de validar XML contra um esquema
● Não será possível saber se um exercício foi ou não resolvido se não for possível validar
5 ww
w.a
rgon
avis
.com
.br
Formato do curso
● Material didático (ZIP disponibilizado na rede) ● Slides ● Apostila com material de referência (30 páginas) ● Material sobre expressões regulares ● Material extra com revisão de XML básico ● Exemplos e exercícios para resolver
● Mais de 50% deste curso é dedicado a exercícios práticos ● É essencial que os exercícios sejam feitos em sala de
aula ao longo do curso (não deixe tudo para o final) ● Haverá uma avaliação no final com testes de múltipla
escolha (similares aos da certificação da IBM)
6 ww
w.a
rgon
avis
.com
.br
Módulo opcional
● O módulo 8 trata de mapeamento Java-XML
● Trata-se de um módulo prático que tem como pré-requisito a linguagem Java
● Pacotes utilizados
● JAXB 2.0 EA2 (da distribuição Java, julho/2005)
● Apache XML Beans 2.0
● Através dos pacotes acima, pode-se construir aplicações onde classes são mapeadas a esquemas, e objetos são mapeados a documentos XML
● A criação de um XML causa a criação de um objeto e vice-versa
● Ferramentas usadas: Eclipse / NetBeans
7 ww
w.a
rgon
avis
.com
.br
Referências
● Fontes usadas na elaboração deste treinamento ● Priscila Walmsley. Definitive XML Schema.
Prentice-Hall, 2002
● Especificações do W3C, XML Schema 1.0, níveis 0, 1 e 2. http://www.w3.org/XML/Schema
1 ww
w.a
rgonavis
.com
.br
introdução
principais componentes
© 2002, 2005, 2008 Helder da Rocha ([email protected])
X170
2 ww
w.a
rgonavis
.com
.br
O Que é um XML Schema?
● Esquema = plano, projeto, estrutura,
diagrama, especificação
● Em XML é um documento que descreve uma
classe de documentos XML
● DTD, XML Schema, etc.
● XML Schema é documento XML usado para
especificar documentos XML
● XSDL – XML Schema Definition Language
● Namespace:
http://www.w3.org/2001/XMLSchema
3 ww
w.a
rgon
avis
.com
.br
Para que serve um XML Schema
● Verificar que uma instância (documento XML) é válido em relação a um conjunto de regras ● Estrutura de elementos e atributos,
● Ordem e obrigatoriedade dos elementos,
● Tipos de dados que podem ser usados em atributos e elementos,
● Faixas de valores válidas,
● Padrão que um texto precisa obeceder, etc.
● Documentar o sistema ● Fornecer meta-informação e defaults
● Ser um protocolo de comunicação
4 ww
w.a
rgon
avis
.com
.br
O que é um Esquema XML?
O esquema representa uma classe Os documentos são instâncias
Esquema (universo de documentos válidos)
Documentos que aderem à especificação (válidos)
Documento fora da especificação
" Como definir esquemas: " DTD - Document Type Definition " W3C XML Schema
5 ww
w.a
rgonavis
.com
.br
DTD vs. XML Schema
● Um esquema é essencial para que haja
comunicação usando XML
● Pode ser estabelecido "informalmente" (via software)
● Uso formal permite validação usando ferramentas
genéricas de manipulação de XML
● Soluções padrão do W3C
DTD XML Schema <!ELEMENT contato (nome, email, telefone)> <!ATTLIST contato codigo NMTOKEN #REQUIRED>
<xsd:schema xmlns:xsd=".../XMLSchema"> <xsd:element name="contato"> <xsd:complexType> <xsd:attribute name="codigo" use="required">
• É XML, porém mais complexo
• Suporta namespaces
• Permite definição de tipos
• Simples mas não é XML
• Não suporta namespaces
• Limitado quando a tipos de dados
6 ww
w.a
rgonavis
.com
.br
Exemplo de XML Schema
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="astro" type="astroType" /> <xs:element name="imagem" type="imagemType"/>
<xs:attribute name="href" type="xs:anyURI"/> <xs:attribute name="id" type="xs:ID"/> <xs:attribute name="nome" type="xs:string"/> <xs:attribute name="diametrokm" type="xs:decimal"/>
<xs:complexType name="imagemType"> <xs:attribute ref="href" use="required"/> </xs:complexType>
<xs:complexType name="astroType"> <xs:sequence> <xs:element ref="imagem" minOccurs="0"/> </xs:sequence> <xs:attribute ref="id" use="required"/> <xs:attribute ref="nome" use="required"/> <xs:attribute ref="diametrokm"/> </xs:complexType> </xs:schema>
Definição de
tipos de dados
Elementos
Atributos
7 ww
w.a
rgonavis
.com
.br
Um DTD equivalente
Atributos
Elementos <!ELEMENT astro (imagem*) > <!ELEMENT imagem EMPTY >
<!ATTLIST imagem href CDATA #REQUIRED >
<!ATTLIST astro id ID #REQUIRED > <!ATTLIST astro nome CDATA #REQUIRED > <!ATTLIST astro diametrokm NMTOKEN #IMPLIED >
Tipos de dados simples
(somente para atributos)
Modelo de conteúdo
(tipo de dados complexo)
Atributo sempre
associado a elemento
<astro id="p5" nome="Jupiter"> <imagem href="jup31.jpg" /> <imagem href="jup32.jpg" /> </astro>
Exemplo de documento válido
em relação a este DTD
8 ww
w.a
rgonavis
.com
.br
Outro exemplo
● Considere esta instância XML
<oferta(validade="2010207222">(((((<codigo(numero="4599"(tipo="T"/>(((((<preco>15.2</preco>(((((<itens>14</itens>(</oferta>(
9 ww
w.a
rgonavis
.com
.br
Um DTD que valida a instância
<!ELEMENT(oferta'(codigo,preco,itens)>(<!ATTLIST(oferta(validade(NMTOKEN(#REQUIRED>(
<!ELEMENT(codigo'EMPTY>(<!ATTLIST(codigo(numero(CDATA(#REQUIRED((((((((((((((((((tipo((T(|(P(|(U)(#REQUIRED>(
<!ELEMENT(preco'(#PCDATA)>(<!ELEMENT(itens'(NMTOKEN)>(
10 ww
w.a
rgonavis
.com
.br
Um XML Schema equivalente
<?xml(version="1.0"(encoding="UTF28"?>(<xs:schema(xmlns:xs="http://www.w3.org/2001/XMLSchema"(elementFormDefault="qualified">(((((<xs:element(name="oferta">(((((((((<xs:complexType>(((((((((((((<xs:sequence>(((((((((((((((((<xs:element(ref="codigo"/>(((((((((((((((((<xs:element(ref="preco"/>(((((((((((((((((<xs:element(ref="itens"/>(((((((((((((</xs:sequence>(((((((((((((<xs:attribute(name="validade"(use="required"(type="xs:NMTOKEN"/>(((((((((</xs:complexType>(((((</xs:element>(
((((<xs:element(name="codigo">(((((((((<xs:complexType>(((((((((((((<xs:attribute(name="numero"(use="required"/>(((((((((((((<xs:attribute(name="tipo"(use="required">(((((((((((((((((<xs:simpleType>(((((((((((((((((((((<xs:restriction(base="xs:NMTOKEN">(((((((((((((((((((((((((<xs:enumeration(value="T"(/>(((((((((((((((((((((((((<xs:enumeration(value="P"(/>(((((((((((((((((((((((((<xs:enumeration(value="U"(/>(((((((((((((((((((((</xs:restriction>(((((((((((((((((</xs:simpleType>(((((((((((((</xs:attribute>(((((((((</xs:complexType>(((((</xs:element>(
((((<xs:element(name="preco"(type="xs:string"/>(((((<xs:element(name="itens"(type="xs:string"/>(</xs:schema>(
11 ww
w.a
rgonavis
.com
.br
Um XML Schema melhor
<xs:schema(xmlns:xs="http://www.w3.org/2001/XMLSchema"(…(>(((((<xs:element(name="oferta">(((((((((<xs:complexType>(((((((((((((<xs:sequence>(…(</xs:sequence>(((((((((((((<xs:attribute(name="validade"(use="required"(type="xs:date"/>(((((((((</xs:complexType>(((((</xs:element>(
((((<xs:element(name="codigo">(…(</xs:element>(
((((<xs:element(name="preco">(((((((((<xs:simpleType>(((((((((((((<xs:restriction(base="xs:decimal">(''''''''''''''''<xs:fractionDigits'value="2"'/>(((((((((((((</xs:restriction>(((((((((</xs:simpleType>(((((</xs:element>(
((((<xs:element(name="itens">(((((((((<xs:simpleType>(((((((((((((<xs:restriction(base="xs:integer">(''''''''''''''''<xs:minInclusive'value="1"/>'''''''''''''''''<xs:maxInclusive'value="20"/>(((((((((((((</xs:restriction>(((((((((</xs:simpleType>(((((</xs:element>(</xs:schema>(
12 ww
w.a
rgonavis
.com
.br
XML Schema
● Mais tipos, mais controle
● XML Schema oferece vários tipos de dados para
representar strings, números
● Tipos podem ser usados para validar elementos e
atributos
● Tipos novos podem ser criados a partir dos tipos
primitivos, via extensão e restrição
● Namespace e convenções
● Extensão comum usada em arquivos: *.xsd
● Prefixos mais usados para namespace: xs: ou xsd:
13 ww
w.a
rgonavis
.com
.br
Principais elementos
● Elementos típicos em um esquema simples
● <schema> - elemento raiz
● <element>
● <attribute>
● <simpleType> ou <complexType>
● <simpleContent> ou <complexContent>
● <restriction> ou <extension>
● <enumeration>, <union>, <list>
● <sequence>, <choice>, <all>
14 ww
w.a
rgonavis
.com
.br
Componentes declarados e definidos
● Componentes são
● Atributos
● Elementos
● Tipos
● Notações, etc.
● Componentes declarados no XML Schema são
usados nas instâncias
● Elementos, atributos, notações
● Componentes definidos no XML Schema são
usados internamente
● Tipos de dados, grupos de componentes, ids
15 ww
w.a
rgonavis
.com
.br
Componentes globais e locais
● Componentes globais
● São definidos/declarados no primeiro nível do XML
Schema (filhos diretos de <xs:schema>)
● Têm nome (identificador) através do qual podem
ser usados ou reusados
● Componentes locais
● São definidos/declarados dentro do escopo de
outro componente
● Não têm nome pois não podem ser reusados
16 ww
w.a
rgon
avis
.com
.br
Componentes locais e globais
● O componente <xs:complexType> do esquema abaixo é global; pode ser referenciado pelo nome ofertaType
● É referenciado na declaração de dois elementos
● O componente <xs:complexType> deste outro esquema abaixo é local à declaração do elemento oferta e não pode ser reusado
<xs:schema(xmlns:xs="http://www.w3.org/2001/XMLSchema">(((((<xs:element(name="oferta"(type="ofertaType"(/>(((((<xs:element(name="promocaoRelampago"(type="ofertaType"(/>(((((<xs:complexType'name="ofertaType">...</xs:complexType>(((((…(</xs:schema>(
<xs:schema(xmlns:xs="http://www.w3.org/2001/XMLSchema">(((((<xs:element(name="oferta">(((((((((<xs:complexType>...</xs:complexType>(((((</xs:element>(((((...(
17 ww
w.a
rgon
avis
.com
.br
Tipos
● O tipo define a estrutura dos dados que pode ser usada na declaração de um elemento ou atributo.
● Pode ser local ou global
● Pode ser simples ou complexo
● Se for simples, pode ser nativo ou derivado
● Se for complexo, pode ter conteúdo simples, conteúdo complexo, conteúdo misto ou vazio
18 ww
w.a
rgonavis
.com
.br
Tipos simples e complexos
● Tipos simples
● Podem ter conteúdo de texto apenas
● Não podem conter estrutura de elementos e atributos
● Podem ser usados na declaração de atributos ou elementos
● Tipos complexos
● Podem ter elementos e atributos como conteúdo
● Podem ser usados na declaração de elementos
● Não podem ser usados na declaração de atributos
● Tipos novos podem ser derivados a partir de tipos
existentes de duas formas
● Através de restrição (válida para tipos simples e complexos)
● Através de extensão (apenas para tipos complexos)
19 ww
w.a
rgonavis
.com
.br
<xs:simpleType>
● Tipo que apenas pode conter texto
● É possível criar novos tipos a partir de
derivação dos tipos existentes (globalmente
acessíveis)
<xs:simpleType(name="astroID">(((<xs:restriction(base="xs:ID">(((((<xs:pattern(value="\c\d.*"/>(((</xs:restriction>(</xs:simpleType>(
Expressão regular
20 ww
w.a
rgonavis
.com
.br
Tipos simples nativos do XML Schema
anySimpleType(
gDay(
string(
normalizedString(
token(
language( Name( NMTOKEN(
NCName( NMTOKENS(
ID( IDREF( ENTITY(
IDREFS( ENTITIES(
decimal(
integer(nonPositiveInteger( nonNegativeInteger(
negativeInteger( positiveInteger(long(
int(
short(
byte(
unsignedLong(
unsignedInt(
unsignedShort(
unsignedByte(
boolean(
base64binary( hexbinary(
float(
double( anyURI( QName(NOTATION(
duration( gYearMonth( gYear( gMonth(dateTime( time( date(
21 ww
w.a
rgon
avis
.com
.br
Exemplo: derivação de um tipo simples
● Tipo base: xs:NMTOKEN ● Tipo derivado: isbn
● Faceta de comprimento: exatamente 10 caracteres
● Faceta de formato: descrito por expressão regular
<xs:simpleType(name="isbn">(((<xs:restriction(base="xs:NMTOKEN">(((((<xs:length(value="10"/>((((((<xs:pattern(value="[029]{9}[029X]"/>(((</xs:restriction>(</xs:simpleType>(
22 ww
w.a
rgonavis
.com
.br
<xs:complexType>
● Tipo que pode conter outros elementos ou
atributos
<xs:complexType(name="imagemType">(((<xs:attribute(name="href"(type="xs:anyURI"/>(</xs:complexType>(
<xs:complexType(name="astroType">(((<xs:sequence>(((((<xs:element(ref="imagem"(minOccurs="0"/>(((((<xs:element(name="satelite"(type="sateliteType"((((((((((((((((((minOccurs="0"(maxOccurs="unbounded"/>(((</xs:sequence>(((<xs:attribute(name="id"(type="astroID"(use="required"/>(((<xs:attribute(name="nome"(type="xs:token"(/>(((<xs:attribute(name="diametrokm"(type="xs:decimal"/>(</xs:complexType>(
23 ww
w.a
rgonavis
.com
.br
O que representam os tipos
● Tipos simples representam tipos de dados
básicos como texto, números, tokens, booleanos
● Fazem parte do namespace do XML Schema
(requerem prefixo associado ao identificador do
namespace), por exemplo: xs:int, xs:string
● Tipos complexos representam estruturas do
documento como entidades, atributos, etc.
● Podem fazer parte do namespace default do próprio
documento (e não necessitar de prefixo) se definidos
localmente
24 ww
w.a
rgonavis
.com
.br
Fundamentos: Modelos de conteúdo
● Definem a estrutura de tipos complexos
● Modelos de conteúdo podem ser simples ou
complexos
● São simples quando elemento é vazio ou
quando contém apenas texto
● Modelo de conteúdo simples pode conter atributos
● São complexos quando elemento contém
outros elementos
● Elementos podem ser definidos localmente
● Elementos globais podem ser reutilizados
25 ww
w.a
rgonavis
.com
.br
<xs:simpleContent>
● Modelo de conteúdo simples
● Determina o tipo dos dados contido em um
elemento que pode possuir atributos
<xs:complexType(name="imagemType">(((<xs:simpleContent>(((((<xs:restriction(base="xs:string">(((((((<xs:attribute(name="href"(((((((((((((((((((((type="xs:anyURI"/>(((((</xs:restriction>(((</xs:simpleContent>(</xs:complexType>(
26 ww
w.a
rgonavis
.com
.br
<xs:complexContent>
● Modelo de conteúdo complexo
● Determina a organização dos elementos filho
(se uma lista de opções, uma seqüência, etc.
<xs:complexType(name="estrelaType">((((<xs:complexContent>(((((((<xs:extension(base="astroType">((((((((((<xs:sequence>(((((((((((((<xs:element(name="satelite"(((((((((((((((((((((((((type="sateliteType"(((((((((((((((((((((((((minOccurs="0"(((((((((((((((((((((((((maxOccurs="unbounded"/>((((((((((</xs:sequence>((((((((((<xs:attribute(name="cor"(type="xs:token"/>(((((((</xs:extension>((((</xs:complexContent>(</xs:complexType>(
27 ww
w.a
rgonavis
.com
.br
<xs:sequence>
● Conteúdo de tipos complexos
● Equivalente ao conteúdo (a, b, c) em DTD
<xs:element(name="sistemaEstelar">(((<xs:complexType>(((((<xs:sequence>(((((((<xs:element(name="centro"(type="centroType"/>(((((((<xs:element(name="orbita"(type="orbitaType"(((((((((((((((((((minOccurs="0"(maxOccurs="unbounded"/>(((((((<xs:element(ref="cometa"(minOccurs="0"((((((((((((((((((((maxOccurs="unbounded"/>(((((</xs:sequence>(((</xs:complexType>(</xs:element>(
Equivalente, em DTD, a (centro, orbita*, cometa*)
28 ww
w.a
rgonavis
.com
.br
<xs:choice>
● Conteúdo de tipos complexos
● Equivalente ao conteúdo (a | b | c) no DTD
<xs:complexType(name="orbitaType">(((<xs:choice>(((((<xs:element(name="estrela"(type="estrelaType"/>(((((<xs:element(name="planeta"(type="sateliteType"/>(((((<xs:element(name="asteroide"(type="sateliteType"((((((((((((((((((minOccurs="0"(maxOccurs="unbounded"/>(((</xs:choice>(((<xs:attribute(name="raioMedUA"(type="xs:decimal"/>(</xs:complexType>(
Equivalente a (estrela | planeta | asteroide*)
1 ww
w.a
rgonavis
.com
.br
definição e composição de
esquemas
instâncias
documentação
© 2002, 2005, 2008 Helder da Rocha ([email protected])
X170
2 ww
w.a
rgonavis
.com
.br
Cabeçalho e namespace
● Todas as declarações do XML Schema estão contidas em
um elemento <xs:schema> que deve definir:
● Um atributo xmlns, declarando o namespace do XML Schema,
geralmente associando-o a um prefixo (xs ou xsd).
● Um atributo targetNamespace*, contendo uma URI que
identifique o namespace da linguagem-alvo que o XML Schema
está descrevendo
● Um segundo atributo xmlns*, declarando o namespace da
linguagem-alvo, possivelmente associando-o a um prefixo.
<xs:schema*xmlns:xs="http://www.w3.org/2001/XMLSchema"*****targetNamespace="http://www.empresa.com/pontodevenda"******xmlns="http://www.empresa.com/pontodevenda">*
Se a linguagem não usar namespaces:
<xs:schema*xmlns:xs="http://www.w3.org/2001/XMLSchema”>*
3 ww
w.a
rgonavis
.com
.br
Composição de esquemas
● <xs:include> insere componentes de esquema do mesmo
namespace localizados em outros arquivos
● Atributo schemaLocation informa a URI onde se encontra o
arquivo que será incluído
*<xs:include2schemaLocation="esquema.xsd"/>
● <xs:import> importa componentes de namespaces
diferentes
● Atributo namespace é obrigatório
● Atributo schemaLocation é opcional
*<xs:import2namespace="http://ns.com"*schemaLocation="esquema.xsd"/>
● <xs:redefine> permite redefinir componentes
4 ww
w.a
rgonavis
.com
.br
<xs:include>
<xs:schema*xmlns:xs="http://www.w3.org/2001/XMLSchema"******targetNamespace="http://www.empresa.com/pontodevenda"*****xmlns="http://www.empresa.com/pontodevenda">*
2222<xs:include2schemaLocation="ofertaTypesComplex.xsd"/>22222<xs:include2schemaLocation="ofertaTypesSimple.xsd"/>*
****<xs:element*name="oferta"*type="ofertaType"*/>*****<xs:element*name="codigo"*type="codigoType"/>*****<xs:element*name="preco"*type="precoType"/>*****<xs:element*name="itens"*type="itensType"/>*
</xs:schema>*
<xs:complexType*name="ofertaType">*…*
ofertaTypesComplex.xsd*
<xs:simpleType*name="precoType">*…*
ofertaTypesSimple.xsd*
5 ww
w.a
rgonavis
.com
.br
<xs:import>
<xs:schema*xmlns:xs="http://www.w3.org/2001/XMLSchema"******targetNamespace="http://www.empresa.com/pontodevenda"*****xmlns="http://www.empresa.com/pontodevenda"*****xmlns:pdvt="http://www.empresa.com/pontodevenda/tipos">*
****<xs:import*********namespace="http://www.empresa.com/pontodevenda/tipos"*********schemaLocation="ofertaTypesAll.xsd"/>*
****<xs:element*name="oferta"*type="pdvt:ofertaType"*/>*****<xs:element*name="codigo"*type="pdvt:codigoType"/>*****<xs:element*name="preco"**type="pdvt:precoType"/>*****<xs:element*name="itens"**type="pdvt:itensType"/>*
</xs:schema>*
<xs:schema*******targetNamespace="http://www.empresa.com/pontodevenda/tipos"*...*>*
6 ww
w.a
rgonavis
.com
.br
<xs:import> : o outro lado
<xs:schema*xmlns:xs="http://www.w3.org/2001/XMLSchema"******targetNamespace="http://www.empresa.com/pontodevenda/tipos"*****xmlns="http://www.empresa.com/pontodevenda/tipos"*****xmlns:pdv="http://www.empresa.com/pontodevenda">*
****<xs:import*namespace="http://www.empresa.com/pontodevenda"**********schemaLocation="ofertaElementsAll.xsd"></xs:import>*
****<xs:complexType*name="ofertaType">*********<xs:sequence>*************<xs:element*ref="pdv:codigo"/>*************<xs:element*ref="pdv:preco"/>*************<xs:element*ref="pdv:itens"/>*********</xs:sequence>*********<xs:attribute*name="validade"*use="required"*type="xs:NMTOKEN"/>*****</xs:complexType>*
****<xs:complexType*name="codigoType">...</xs:complexType>*****<xs:simpleType*name="precoType">...</xs:simpleType>*****<xs:simpleType*name="itemType">...</xs:simpleType>*</xs:schema>*
<xs:schema*******targetNamespace="http://www.empresa.com/pontodevenda"*...*>*
7 ww
w.a
rgonavis
.com
.br
Defaults
● <xs:schema> contém atributos que definem
defaults para tipos e elementos.
● attributeFormDefault="qualified|unqualified"
● elementFormDefault="qualified|unqualified"
● blockDefault="#all|substitution|extension|
restriction"
● finalDefault="#all|extension|restriction|list|union"
● Determinam comportamento default em
declarações e definição de componentes
● (Mais sobre isto adiante)
8 ww
w.a
rgonavis
.com
.br
Instâncias associadas a um XML Schema
● Uma instância pode ser formalmente vinculada
a uma instância através de atributos globais
● Namespace XML Schema Instance:
http://www.w3.org/2001/XMLSchema-instance
● Este namespace deve ser atribuído a prefixo
para que se possa usar seus 4 atributos:
● schemaLocation – para vincular um ou mais XML
Schemas à instância
● noNamespaceSchemaLocation – para vincular a um
XML Schemas que não usa namespace
● nil e type – usados em elementos e atributos
9 ww
w.a
rgonavis
.com
.br
Exemplos com namespace
<oferta*xmlns:xsi="http://www.w3.org/2001/XMLSchemaQinstance"***xsi:schemaLocation="http://www.empresa.com/pontodevenda***********************ofertaElementsAllImport.xsd"*****xmlns="http://www.empresa.com/pontodevenda"******validade="2010Q07Q22">*
****<codigo*numero="4599"*tipo="T"/>*****<preco>15.2</preco>*****<itens>14</itens>*</oferta>*
<pdv:oferta*xmlns:xsi="http://www.w3.org/2001/XMLSchemaQinstance"*****xsi:schemaLocation="http://www.empresa.com/pontodevenda*************************ofertaElementsAllImport.xsd"*****xmlns:pdv="http://www.empresa.com/pontodevenda"******validade="2010Q07Q22">*
****<pdv:codigo*numero="4599"*tipo="T"/>*****<pdv:preco>15.2</pdv:preco>*****<pdv:itens>14</pdv:itens>*</pdv:oferta>*
10 ww
w.a
rgonavis
.com
.br
Múltiplos namespaces
● Schemas compostos requerem a declaração de
múltiplos namespaces na instância
● Esquema principal
● Instância
<xs:schema******targetNamespace="http://cosmos.org.br"******xmlns:cm="http://cosmos.org.br/com"******xmlns:st="http://cosmos.org.br/sat"******xmlns="http://cosmos.org.br"******xmlns:xs="http://www.w3.org/2001/XMLSchema">*
<se:sistemaEstelar*xmlns:se="http://cosmos.org.br"****xmlns:sat="http://cosmos.org.br/sat"****xmlns:cmt="http://cosmos.org.br/com"****xmlns:xsi="http://www.w3.org/2001/XMLSchemaQinstance"*****xsi:schemaLocation="http://cosmos.org.br*******sistema.xsd************************http://cosmos.org.br/sat***satelites.xsd************************http://cosmos.org.br/com***cometas.xsd">*
11 ww
w.a
rgonavis
.com
.br
Exemplo com múltiplos namespaces
<html*xmlns:xsi="http://www.w3.org/2001/XMLSchemaQinstance"*****xsi:schemaLocation="http://www.w3.org/1999/xhtml22xhtml.xsd*******************http://www.empresa.com/pontodevenda2oferta.xsd"*****xmlns="http://www.w3.org/1999/xhtml"********xmlns:pdv="http://www.empresa.com/pontodevenda">*****<head>...</head>*
****<body><div*class="oferta”>*********<pdv:oferta*validade="2010Q07Q22">*************<pdv:codigo*numero="4599"*tipo="T"/>*************<pdv:preco>15.2</pdv:preco>*************<pdv:itens>14</pdv:itens>*********</pdv:oferta>*****</div></body>*
</html>*
<html*xmlns:xsi="http://www.w3.org/2001/XMLSchemaQinstance"*****xsi:schemaLocation="http://www.w3.org/1999/xhtml22xhtml.xsd*******************http://www.empresa.com/pontodevenda2oferta.xsd"*****xmlns="http://www.w3.org/1999/xhtml"*>*****<head>...</head><body><div*class="oferta”>*
********<oferta*validade="2010Q07Q22"*xmlns="http://www.empresa.com/pontodevenda">*
************<codigo*numero="4599"*tipo="T"/>*************<preco>15.2</preco>*
************<itens>14</itens>*********</oferta>*
****</div></body>*
</html>*
12 ww
w.a
rgonavis
.com
.br
Exemplo sem namespace
<oferta*xmlns:xsi="http://www.w3.org/2001/XMLSchemaQinstance"*****xsi:noNamespaceSchemaLocation="ofertaElementsNoNS.xsd"******validade="2010Q07Q22">*
****<codigo*numero="4599"*tipo="T"/>*****<preco>15.2</preco>*****<itens>14</itens>*</oferta>*
13 ww
w.a
rgonavis
.com
.br
Anotações
● <xs:annotation>
● Mecanismo de documentação e extensão do XML
Schema
● Pode ser usado em qualquer elemento do XML
Schema
● Dois sub-elementos: <xs:documentation> e
<xs:appinfo>
● <xs:documentation>
● Para documentação que será lida por humanos
● <xs:appinfo>
● Ponto de extensão para informações de
processamento que serão lidas por máquina
14 ww
w.a
rgonavis
.com
.br
Anotações
<xs:complexType*name="ofertaType">*2222<xs:annotation>222222222<xs:documentation2xml:lang="ptFBR">2222222222222Os2codigos2existentes2podem2ser2obtidos22222222222222na2tabela2PROD_CODIGOS.222222222</xs:documentation>222222222<xs:appinfo>2222222222222SELECT2CODIGOS2FROM2PROD_CODIGOS22222222222222222222222222222WHERE2STATUS2<22;222222222</xs:appinfo>22222</xs:annotation>*****<xs:sequence>*********<xs:element*ref="codigo"/>*********<xs:element*ref="preco"/>*********<xs:element*ref="itens"/>*****</xs:sequence>*****<xs:attribute*name="validade"********************use="required"*type="xs:NMTOKEN"/>*</xs:complexType>*
1 ww
w.a
rgonavis
.com
.br
elementos e atributos
© 2002, 2005, 2008 Helder da Rocha ([email protected])
X170
2 ww
w.a
rgonavis
.com
.br
Elementos
● Declarados através de <xs:element>
● Declaração (global ou local) deve ter atributo
name
● Pode conter elemento <xs:simpleType> ou
<xs:complexType>, ou atributo type com
referência para tipo nativo ou global
● Referência a um elemento global através de
atributo ref, em definições de tipos complexos
3 ww
w.a
rgonavis
.com
.br
<xs:element>
● Define um elemento
● Deve estar associado a um tipo de dados
ou
<xs:complexType-name="cometaType">---<xs:attribute-name="id"-type="xs:ID"-use="required"/>---<xs:attribute-name="nome"-type="xs:string"-use="required"/>---<xs:attribute-name="planetas"-type="xs:IDREFS"/>-</xs:complexType>-
<xs:element-name="cometa"-type="cometaType"-/>-
<xs:element-name="cometa">---<xs:complexType>-----<xs:attribute-name="id"-type="xs:ID"-use="required"/>-----<xs:attribute-name="nome"-type="xs:string"-use="required"/>-----<xs:attribute-name="planetas"-type="xs:IDREFS"/>---</xs:complexType>-</xs:element>-
4 ww
w.a
rgonavis
.com
.br
Exemplo <xs:element>
<xs:schema-...->-----<xs:element-name="oferta"-type="ofertaType"-/>-----<xs:element-name="preco">---------<xs:simpleType>-------------<xs:restriction-base="xs:decimal">-----------------<xs:fractionDigits-value="2"-/>-------------</xs:restriction>---------</xs:simpleType>-----</xs:element>-
----<xs:complexType-name="ofertaType">---------<xs:sequence>-------------<xs:element-name="codigo"-type="codigoType"/>-------------<xs:element-ref="preco"/>-------------<xs:element-name="itens">-----------------<xs:simpleType>-...-</xs:simpleType>-------------</xs:element>---------</xs:sequence>-----</xs:complexType>-
----<xs:complexType-name="codigoType">...</xs:complexType>-
Referência a elemento global
Declaração local com referência a
tipo global codigoType
Declaração local com definição
local de um simpleType
Declaração global com referência a
tipo global ofertaType
Declaração global com
definição local de um
simpleType
5 ww
w.a
rgonavis
.com
.br
4 maneiras de associar um tipo a um elemento
<xs:element-name="endereco"-type="xsd:string"-/>-
<xs:element-name="tudo"-/>-
<xs:element-name="cpf"-type="CpfType"-/>-
<xs:element-name="itens">-----<xs:simpleType>---------<xs:restriction-base="xs:integer">-------------<xs:minInclusive-value="1"/>-------------<xs:maxInclusive-value="20"/>---------</xs:restriction>-----</xs:simpleType>-</xs:element>-
6 ww
w.a
rgonavis
.com
.br
Valores default para elementos
● Valores default podem ser atribuídos caso o
elemento esteja ausente ou vazio
<xs:element-ref="preco"-default="0.00"/>-<xs:element-name="itens"-type="itensType"-default="10">-
<oferta-validade="2010J10J10">-----<codigo-numero="4599"-tipo="T"-/>-----<itens-/>-</oferta>-
<oferta-validade="2010J10J10">-----<codigo-numero="4599"-tipo="T"-/>-7777<preco>0.00</preco>-----<itens>10</itens>-</oferta>-
Documento original
Documento após o
processamento
7 ww
w.a
rgonavis
.com
.br
Atributos
● Geralmente declarados em tipos complexos
● Localmente, no contexto do tipo que será
associado a um elemento
● Podem ser declarados globalmente
● Para esquemas que fornecem atributos globais
(geralmente prefixados)
● Dentro de tipos complexos, são declarados
após o conteúdo
● Declaram-se atributos com <xs:attribute>
8 ww
w.a
rgonavis
.com
.br
<xs:attribute>
● Define um atributo
● Pode estar embutido na definição de um tipo
ou globalmente acessível (para reutilização)
<xs:attribute-name="raio"-type="xs:decimal"/>-
<xs:complexType-name="sateliteType">---<xs:complexContent>-----<xs:extension-base="astroType">------<xs:attribute-ref="raio"-use="required"/>------<xs:attribute-name="anoDesc"-type="xs:int"/>-----</xs:extension>---</xs:complexContent>-</xs:complexType>-
9 ww
w.a
rgonavis
.com
.br
Exemplo
<xs:complexType-name="ofertaType">-----<xs:sequence>---------<xs:element-name="codigo"-type="codigoType"/>---------<xs:element-ref="preco"/>---------<xs:element-name="itens">...</xs:element>-----</xs:sequence>-7777<xs:attribute7name="validade"77777777777777777777use="required"7type="xs:NMTOKEN"/>-</xs:complexType>-
10 ww
w.a
rgonavis
.com
.br
Atributos globais
<xs:schema-xmlns:xs="http://www.w3.org/2001/XMLSchema"-------attributeFormDefault="qualified"-----targetNamespace="http://www.x.com/contabilidade"-----xmlns="http://www.x.com/contabilidade">-
----<xs:attribute7name="tributado"7type="xs:boolean"7/>7...7
<oferta-contab:tributado="true"----------xmlns:contab="http://www.x.org/contabilidade">-----...--
XML Schema
Instância
11 ww
w.a
rgonavis
.com
.br
4 maneiras de declarar atributos
<xs:attribute-name="validade"-type="xs:NMTOKEN"/>-
<xs:attribute-name="tudo"-/>-
<xs:attribute-name="tipo"-use="required">-----<xs:simpleType>---------<xs:restriction-base="xs:NMTOKEN">-------------<xs:enumeration-value="T"-/>-------------<xs:enumeration-value="P"-/>-------------<xs:enumeration-value="U"-/>---------</xs:restriction>-----</xs:simpleType>-</xs:attribute>--
<xs:attribute-name="validade"----------------type="xs:date"-----------------default="1990I01I01"7/>-
1 ww
w.a
rgonavis
.com
.br
tipos simples
uniões e listas
tipos nativos
© 2002, 2005, 2008 Helder da Rocha ([email protected])
X170
2 ww
w.a
rgonavis
.com
.br
Tipos simples
● Elementos ou atributos podem ter conteúdo
definido como tipo simples
● Tipos simples podem ser:
● valores atômicos
● listas
● uniões
● São definidos com o elemento
<xs:simpleType>
● São tipos complexos
● Tipos que contém outros elementos
● Tipos que contém atributos (mesmo que vazios)
3 ww
w.a
rgonavis
.com
.br
Tipos base e derivação por restrição
● Todo tipo simples é uma derivação por
restrição de outro tipo simples, que é
chamado de tipo base.
● Não é possível estender tipos simples
● A restrição é feita com <xs:restriction>
● Pode ser sobre tipos primitivos ou nativos
● Pode ser sobre tipos criados no próprio esquema ou
importados
● Restrição reduz o tamanho do tipo usando
facetas (limites, comprimentos, etc)
4 ww
w.a
rgonavis
.com
.br
Exemplos com <xs:restriction> em tipos simples
<xs:element*name="itens">*****<xs:simpleType>*********<xs:restriction*base="xs:integer">*************<xs:minInclusive*value="1"/>*************<xs:maxInclusive*value="20"/>*********</xs:restriction>*****</xs:simpleType>*</xs:element>*
<xs:attribute*name="tipo"*use="required">*****<xs:simpleType>*********<xs:restriction*base="xs:NMTOKEN">*************<xs:enumeration*value="T"*/>*************<xs:enumeration*value="P"*/>*************<xs:enumeration*value="U"*/>*********</xs:restriction>*****</xs:simpleType>*</xs:attribute>*
Facetas
5 ww
w.a
rgonavis
.com
.br
Facetas
● Limites
● <xs:minExclusive>, <xs:minInclusive>,
● <xs:maxExclusive>, <xs:maxInclusive>
● Comprimento
● <xs:length>, <xs:<minLength>, <xs:maxLength>
● Quantidade de dígitos
● <xs:totalDigits>, <xs:fractionDigits>
● Conversão de espaços
● <xs:whitespace>
● Enumeração
● <xs:enumeration>
● Expressão regular
● <xs:pattern>
6 ww
w.a
rgonavis
.com
.br
Facetas de limites numéricos
● Usada em tipos numéricos
● Pode-se usar um e no máximo dois elementos, um
mínimo, e um máximo
● <xs:minExclusive value="valor">
● Limite inferior é maior que valor
● <xs:minInclusive value="valor">
● Limite inferior é maior ou igual a valor
● <xs:maxExclusive value="valor">
● Limite superior é menor que valor
● <xs:maxInclusive value="valor">
● Limite superior é menor ou igual a valor
7 ww
w.a
rgonavis
.com
.br
Facetas de comprimento
● Usado em strings
● Deve ser um número positivo
● <xs:length>
● Comprimento exato
● <xs:minLength>
● Comprimento mínimo
● <xs:maxLength>
● Comprimento máximo
8 ww
w.a
rgonavis
.com
.br
Facetas de quantidade de dígitos
● Usado em números
● <xs:totalDigits>
● Dígitos totais
● <xs:fractionDigits>
● Dígitos depois do ponto decimal
● Deve ser menor ou igual a totalDigits
9 ww
w.a
rgon
avis
.com
.br Facetas de política de conversão de espaços
● Define a política de tratamento de espaços
● <xs:whitespace>
● O atributo value pode ter os valores
● preserve – preserva os espaços em branco, novas lihas, tabulações, etc.
● replace – substitui as novas-linhas e tabulações por um espaço, e preserva os outros espações
● collapse – substitui múltiplos espaços por um espaço, e elimina os espaços antes e depois
10 ww
w.a
rgon
avis
.com
.br
Enumeração
● <xs:enumeration>
● Pode aparecer várias vezes
● Cada <xs:enumeration> inclui um valor que pode ser atribuído ao tipo
● Os valores de cada <xs:enumeration> devem ser compatíveis com o tipo base.
11 ww
w.a
rgonavis
.com
.br
Expressão regular
● <xs:pattern>
● Permite que se passe, no atributo value, uma
expressão regular que irá filtrar e restringir o
tipo base
● Exemplo
● <xs:pattern value="((\d+\s*){3})*” />
● Veja mais detalhes no módulo sobre
expressões regulares
12 ww
w.a
rgonavis
.com
.br
Uniões
● Combinam vários tipos em um
● <xs:union>
<xs:simpleType*name="TamanhoType">*4444<xs:union>*********<xs:simpleType>*************<xs:restriction*base="xs:integer">*****************<xs:minInclusive*value="1"></xs:minInclusive>*****************<xs:maxInclusive*value="16"></xs:maxInclusive>*************</xs:restriction>*********</xs:simpleType>*********<xs:simpleType>*************<xs:restriction*base="xs:token"*****************<xs:enumeration*value="P"></xs:enumeration>*****************<xs:enumeration*value="M"></xs:enumeration>*****************<xs:enumeration*value="G"></xs:enumeration>*****************<xs:enumeration*value="XG"></xs:enumeration>*************</xs:restriction>*********</xs:simpleType>*4444</xs:union>*</xs:simpleType>*
13 ww
w.a
rgonavis
.com
.br
Uniões com memberTypes
● Pode-se formar uniões por referência, se tipos
forem globais, com atributo memberTypes
<xs:simpleType*name="TamanhoType">*****<xs:union*memberTypes="TamanhoNumericoType*"*/>*****<xs:simpleType>*********<xs:restriction*base="xs:token"*************<xs:enumeration*value="P"></xs:enumeration>*************<xs:enumeration*value="M"></xs:enumeration>*************<xs:enumeration*value="G"></xs:enumeration>*************<xs:enumeration*value="XG"></xs:enumeration>*********</xs:restriction>*****</xs:simpleType>*****</xs:union>*</xs:simpleType>**
<xs:simpleType*name="TamanhoType">*****<xs:union*memberTypes="TamanhoNumericoType*TamanhoLetraType"*/>*</xs:simpleType>*
14 ww
w.a
rgonavis
.com
.br
Listas
● Listas são valores atômicos separados por
espaços
<polygon*coords="100*0*250*100*0*250*150*50*0*50"*/>*
<time*tamanhos="M*G*XG*P*M*G*G*XG*XG*G*G*G*M*M*G"*/>*
● <xs:list>
● Cria-se uma lista com
● valores de um tipo simples local, ou
● referencia um tipo global usando o atributo
itemType
15 ww
w.a
rgonavis
.com
.br
Exemplo de listas
<xs:simpleType*name="CoordsType">*4444<xs:list>*******<xs:simpleType>**********<xs:restriction*base="xs:integer">*************<xs:minInclusive*value="M1024"*/>*************<xs:maxInclusive*value="1024"*/>**********</xs:restriction>*******</xs:simpleType>*444</xs:list>*</xs:simpleType>*
16 ww
w.a
rgonavis
.com
.br
Tipos nativos
Veja*http://www.xml.dvint.com/docs/SchemaDataTypesQRM2.pdf*
17 ww
w.a
rgonavis
.com
.br
Tipos primitivos e exemplos de uso
• *xs:string:** * * * *"um*texto",*"abc"*• *xs:boolean:* * * * *true*ou*false*• *xs:decimal:* * * * *M12,*12.3333*• *xs:float*e*xs:double:* *200.56,*3.12eM2*• *xs:duration:* * * * *MP3Y9M8D2H42M55S*• *xs:dateTime:* * * * *2010M12M06T08:30:55M03:00*• *xs:time:* * * * * *08:30:55*• *xs:date:* * * * * *2010M12M06*• *xs:gYear:* * * * * *2010*• *xs:gYearMonth:* * * *2010M12*• *xs:gMonthDay:** * * *MM12M06*• *xs:gMonth:** * * * *MM12*• *xs:gDay:* * * * * *MMM06*• *xs:hexBinary:** * * *0FB8*• *xs:base64Binary: * * *0FB8*• *xs:anyURI:** * * * *http://www.xyz.com*• *xs:QName:* * * * * *pdv:preco*• *xs:NOTATION**
1 ww
w.a
rgonavis
.com
.br
tipos complexos
modelos de conteúdo
grupos
© 2002, 2005, 2008 Helder da Rocha ([email protected])
X170
2 ww
w.a
rgonavis
.com
.br
O que são tipos complexos
● No exemplo acima possuem tipos complexos os elementos:
● <curso>, <titulo>, <carga-horaria>, <pre-requisito> e <topicos>
● E possuem tipos simples os elementos:
● <titulo> e <item>
<curso'grupo="xml"'assunto="1"'subgrupo="0"'fragmento="0">'''''<titulo>XML:'uma'introdução'prática</titulo>'''''<cargaBhoraria'horas="24"/>'''''<preBrequisito'tipo="obrigatorio">Conhecimento'elementar'de'alguma'linguagem'de'markup'como'HTML</preBrequisito>'''''<topicos>'''''''''<item>Introdução'a'XML</item>'''''''''<item>Como'escrever'documentos'XML</item>'''''''''<item>Estrutura'de'uma'página'XML</item>'''''''''<item>Como'especificar'uma'linguagem'usando'DTD</item>'''''''''<item>XML'Namespaces</item>'''''</topicos>'</curso>'
3 ww
w.a
rgonavis
.com
.br
Como construir
● Um tipo complexo pode ser construído de três
formas:
● A partir de conteúdo simples (elemento
<xs:simpleContent>)
● Através da definição de um grupo de elementos
(<xs:all>, <xs:group>, <xs:choice>,
<xs:sequence>)
● Através da extensão de outro tipo complexo
(<xs:complexContent>)
4 ww
w.a
rgonavis
.com
.br
Conteúdos
● Um tipo complexo pode conter quatro tipos
diferentes de conteúdo
● Conteúdo simples
● Conteúdo de elementos
● Conteúdo misto
● Conteúdo vazio
5 ww
w.a
rgonavis
.com
.br
Conteúdo simples
● Permite apenas texto
● A sintaxe para incluir atributos requer declarar
uma <xs:extension> para o conteúdo simples,
dentro do qual se declara o <xs:attribute>
<preBrequisito'tipo="obrigatorio">Conhecimento'elem...</item>'
<xs:element'name="preBrequisito">'''''<xs:complexType>'!!!!!!!!<xs:simpleContent>'''''''''''''<xs:extension'base="xs:string">''''''''''''''''<xs:attribute'name="tipo"'type="xs:NCName"/>'''''''''''''</xs:extension>'!!!!!!!!</xs:simpleContent>'''''</xs:complexType>'</xs:element>'
6 ww
w.a
rgonavis
.com
.br
Conteúdo de elementos
● Só aceita elementos
● Qualquer texto precisa estar dentro de um sub-
elemento.
<topicos>'''''<item>Introdução'a'XML</item>'''''<item>Como'escrever'documentos'XML</item>'''''<item>Estrutura'de'uma'página'XML</item>'''''<item>Como'especificar'uma'linguagem'usando'DTD</item>'''''<item>XML'Namespaces</item>'</topicos>'
<xs:element'name="topicos">'''''<xs:complexType>'!!!!!!!!<xs:sequence>'''''''''''''<xs:element'maxOccurs="unbounded"'ref="item"/>'!!!!!!!!</xs:sequence>'''''</xs:complexType>'</xs:element>'
7 ww
w.a
rgonavis
.com
.br
Conteúdo misto
● Usa o atributo mixed="true" ao definir o tipo
complexo
<descricao>O'curso'<codigo/>:<titulo/>'proporciona'uma'introdução...'veja'as'referências'<link'href="#ref1">[1]</link>'e'...</descricao>'
<xs:element'name="descricao">'''''<xs:complexType>'''''''''<xs:choice'maxOccurs="unbounded"'mixed="true">'''''''''''''<xs:element'ref="titulo"/>'''''''''''''<xs:element'ref="codigo"/>'''''''''''''<xs:element'ref="link"/>'''''''''</xs:choice>'''''</xs:complexType>'</xs:element>'
8 ww
w.a
rgonavis
.com
.br
Conteúdo vazio
● Nenhum conteúdo
● É implicitamente definido ao não declarar nenhum
conteúdo no tipo (exceto atributos)
<cargaBhoraria'horas="24"/>'
<xs:element'name="cargaBhoraria">'''''<xs:complexType>'''''''''<xs:attribute'name="horas"''''''''''''''''''''''''type="xs:integer"/>'''''</xs:complexType>'</xs:element>'
9 ww
w.a
rgon
avis
.com
.br
Modelos de conteúdo para tipos complexos
● Para definir conteúdo formado por elementos, é preciso usar um modelo de conteúdo.
● Há três tipos, cada um definido por um elemento filho de <xs:complexType>:
● <xs:sequence>
● <xs:choice>
● <xs:all>
● Não é possível declarar elementos diretamente abaixo de <xs:complexType>
● É preciso usar os elementos acima.
10 ww
w.a
rgonavis
.com
.br
<xs:sequence>
● Um <xs:sequence> é usado para indicar a
ordem em que os elementos devem ser usados.
<xs:complexType'name="sistemaEstelarType">'!!!!<xs:sequence>'''''''''<xs:element'name="centro"'type="centroType"/>'''''''''<xs:element'name="orbita"'type="orbitaType"''''''''''''''minOccurs="0"'maxOccurs="unbounded"/>'''''''''<xs:element'ref="cm:cometa"''''''''''''''minOccurs="0"'maxOccurs="unbounded"/>'!!!!</xs:sequence>'</xs:complexType>'
<sistemaEstelar'type="sistemaEstelarType">'''''<centro>...</centro>'''''<cm:cometa>...</cm:cometa>'''''<cm:cometa>...</cm:cometa>'''''<orbita>...</orbita>'''''<cm:cometa>...</cm:cometa>'</sistemaEstelar>'
<sistemaEstelar'type="sistemaEstelarType">'''''<centro>...</centro>'''''<cm:cometa>...</cm:cometa>'''''<cm:cometa>...</cm:cometa>'</sistemaEstelar>'
inválido
válido
11 ww
w.a
rgonavis
.com
.br
<xs:choice>
● Um <xs:choice> é usado para escolher um, dentre
vários elementos
● pode ser usado para permitir a inclusão de elementos em
qualquer ordem, se o atributo maxOccurs for "unbounded”
● Blocos <xs:choice> e <xs:sequence> podem ser
aninhados um dentro do outro para permitir modelos de
conteúdo mais complexos
<xs:complexType'name="orbitaType">'!!!!<xs:choice!maxOccurs="unbounded">'''''''''<xs:element'name="estrela"'type="estrelaType"/>'''''''''<xs:element'name="planeta"'type="st:sateliteType"/>'''''''''<xs:element'name="asteroide"'type="st:sateliteType"/>'!!!!</xs:choice>'''''<xs:attribute'name="raioMedUA"'type="xs:decimal"/>'</xs:complexType>'
12 ww
w.a
rgonavis
.com
.br
Grupos: <xs:group>
● Grupos podem ser definidos globalmente no
primeiro nível através do elemento <xs:group>
● deve ter um nome e um conteúdo <xs:choice>,
<xs:sequence>, ou <xs:all>
● Promove o reuso!
<xs:schema'...>'!!!!<xs:group!name="grupoCorpos">'''''''''<xs:choice'maxOccurs="unbounded">'''''''''''''<xs:element'name="estrela"'type="estrelaType"/>'''''''''''''<xs:element'name="planeta"'type="st:sateliteType"/>'''''''''''''<xs:element'name="asteroide"'type="st:sateliteType"/>'''''''''</xs:choice>''''!</xs:group>'''''…'''''<xs:complexType'name="orbitaType">'!!!!!!!!<xs:group!ref="grupoCorpos"!/>'''''''''<xs:attribute'name="raioMedUA"'type="xs:decimal"/>'''''</xs:complexType>'
13 ww
w.a
rgonavis
.com
.br
4 formas de incluir atributos em tipos complexos
<xs:complexType'name="orbitaType">'''''<xs:group'ref="grupoCorpos"'/>'!!!!<xs:attribute!ref="raio"!/>'</xs:complexType>'
<xs:complexType'name="orbitaType">'''''<xs:choice>'''''''''<xs:element'name="estrela"'type="estrelaType"/>'''''''''<xs:element'name="planeta"'type="st:sateliteType"/>'''''''''<xs:element'name="asteroide"'type="st:sateliteType"/>'''''</xs:choice>'!!!!<xs:attribute!name="raioMedUA"!type="xs:decimal"/>'</xs:complexType>'
<xs:complexType>'!!!!<xs:attribute!name="horas"!type="xs:integer"/>'</xs:complexType>'
<xs:complexType>'''''<xs:simpleContent>'''''''''<xs:extension'base="xs:string">'!!!!!!!!!!!!<xs:attribute!name="tipo"!type="xs:NCName"/>'''''''''</xs:extension>'''''</xs:simpleContent>'</xs:complexType>'
14 ww
w.a
rgonavis
.com
.br
Grupos de atributos
● <xs:attributeGroup>
● declarado globalmente cria um grupo de atributos
que podem ser incluidos nos elementos
<xs:attributeGroup'name="codBcurso">'''''<xs:attribute'name="assunto"'use="required"'type="xs:integer"/>'''''<xs:attribute'name="fragmento"'use="required"'type="xs:integer"/>'''''<xs:attribute'name="grupo"'use="required"'type="xs:NCName"/>'''''<xs:attribute'name="subgrupo"'use="required"'type="xs:integer"/>'</xs:attributeGroup>'
<xs:element'name="curso">'''''<xs:complexType>'''''''''<xs:sequence>'''''''''''''<xs:element'ref="titulo"/>'''''''''''''<xs:element'ref="topicos"/>'''''''''</xs:sequence>'''''''''<xs:attributeGroup!ref="codDcurso"!/>!'''''</xs:complexType>'</xs:element>'
1 ww
w.a
rgonavis
.com
.br
extensão
restrição
substituição
© 2002, 2005, 2008 Helder da Rocha ([email protected])
X170
2 ww
w.a
rgonavis
.com
.br
Derivação de tipos complexos
● Pode ser feita de duas formas
● Extensão <xs:extension>
● Restrição <xs:restriction>
● Elementos são incluídos dentro de um
<xs:simpleContent> ou <xs:complexContent>
3 ww
w.a
rgonavis
.com
.br
Extensão de tipos complexos
● No modelo de conteúdo simples
● Extensão para acrescentar atributos
● No modelo de conteúdo complexo
● Extensão para acrescentar atributos
● Extensão para acrescentar elementos
4 ww
w.a
rgonavis
.com
.br
Extensão em conteúdo simples
● Para inclusão de um atributo
● Exemplo de uso
!<xsd:complexType!name="LarguraType">!!!!!!!!!<xsd:simpleContent>!!!!!!!!!!!!!<xsd:extension!base="xsd:integer">!!!!!!!!!!!!!!!!!<xsd:attribute!name="unidade"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!type="UnidadesType"!/>!!!!!!!!!!!!!</xsd:extension>!!!!!!!!!!</xsd:simpleContent>!!!!!</xsd:complexType>!
!!!!<xsd:element!ref="LarguraType"!/>!
<largura!unidade="cm">123</largura>!
Conteúdo simples não é afetado
5 ww
w.a
rgon
avis
.com
.br
Extensão em conteúdo complexo
● Podem adicionar elementos no final do modelo de conteúdo do tipo base
● O tipo resultante combina os elementos existentes seguidos pelos novos como em um <xs:sequence>
● É possível acrescentar novos atributos
● Não é possível redefinir, alterar ou remover atributos existentes
● A extensão de grupos <xs:choice> não resulta em um grupo <xs:choice>
● O efeito é o da criação de um grupo <xs:sequence> contendo os dois grupos <xs:choice>, o anterior seguido pelo novo
● Resultado: elementos incluídos no tipo estendido só podem aparecer depois dos elementos originais
6 ww
w.a
rgonavis
.com
.br
Exemplo de extensão com <xs:sequence>
<xs:complexType!name="ResumidoType">!!!!!<xs:sequence>!!!!!!!!!<xs:element!ref="titulo"/>!!!!!!!!!<xs:element!ref="cargaDhoraria"/>!!!!!!!!!<xs:element!ref="preDrequisito"/>!!!!!</xs:sequence>!</xs:complexType>!
<xs:complexType!name="CompletoType">!!!!!<xs:extension!base="ResumidoType">!!!!!!!!!<xs:sequence>!!!!!!!!!!!!!<xs:element!ref="descricao"/>!!!!!!!!!!!!!<xs:element!ref="objetivo"/>!!!!!!!!!!!!!<xs:element!ref="topicos"/>!!!!!!!!!</xs:sequence>!!!!!!!!!<xs:attributeGroup!ref="cod>curso"/>!!!!!!</xs:extension>!</xs:complexType>!
<xs:complexType>!!!!!<xs:sequence>!!!!!!!!!<xs:sequence>!!!!!!!!!!!!!<xs:element!ref="titulo"/>!!!!!!!!!!!!!<xs:element!ref="cargaDhoraria"/>!!!!!!!!!!!!!<xs:element!ref="preDrequisito"/>!!!!!!!!!</xs:sequence>!!!!!!!!!<xs:sequence>!!!!!!!!!!!!!<xs:element!ref="descricao"/>!!!!!!!!!!!!!<xs:element!ref="objetivo"/>!!!!!!!!!!!!!<xs:element!ref="topicos"/>!!!!!!!!!</xs:sequence>!!!!!</xs:sequence>!!!!!<xs:attributeGroup!ref="cod>curso"/>!</xs:complexType>!
Resultado
equivalente à
extensão
7 ww
w.a
rgonavis
.com
.br
Exemplo de extensão com <xs:choice>
<xs:complexType!name="ResumidoType">!!!!!<xs:choice>!!!!!!!!!<xs:element!ref="titulo"/>!!!!!!!!!<xs:element!ref="cargaDhoraria"/>!!!!!!!!!<xs:element!ref="preDrequisito"/>!!!!!</xs:choice>!</xs:complexType>!
<xs:complexType!name="CompletoType">!!!!!<xs:extension!base="ResumidoType">!!!!!!!!!<xs:choice>!!!!!!!!!!!!!<xs:element!ref="descricao"/>!!!!!!!!!!!!!<xs:element!ref="objetivo"/>!!!!!!!!!!!!!<xs:element!ref="topicos"/>!!!!!!!!!</xs:choice>!!!!!!!!!<xs:attributeGroup!ref="cod>curso"/>!!!!!!</xs:extension>!</xs:complexType>!
<xs:complexType>!!!!!<xs:sequence>!!!!!!!!!<xs:choice>!!!!!!!!!!!!!<xs:element!ref="titulo"/>!!!!!!!!!!!!!<xs:element!ref="cargaDhoraria"/>!!!!!!!!!!!!!<xs:element!ref="preDrequisito"/>!!!!!!!!!</xs:choice>!!!!!!!!!<xs:choice>!!!!!!!!!!!!!<xs:element!ref="descricao"/>!!!!!!!!!!!!!<xs:element!ref="objetivo"/>!!!!!!!!!!!!!<xs:element!ref="topicos"/>!!!!!!!!!</xs:choice>!!!!!</xs:sequence>!!!!!<xs:attributeGroup!ref="cod>curso"/>!</xs:complexType>!
Em elementos do tipo CompletoType
nenhuma ocorrência de <carga-horaria>
pode vir depois de <descricao>
8 ww
w.a
rgonavis
.com
.br
Extensão de conteúdo misto e vazio
● A extensão de tipos com conteúdo misto força
o tipo derivado a também permitir conteúdo
misto
● É necessário declarar o atributo mixed="true" no
tipo derivado
● Um elemento de conteúdo vazio pode ser
estendido para
● Acrescentar atributos
● Acrescentar elementos (e, portanto, deixar de ter
conteúdo vazio)
9 ww
w.a
rgonavis
.com
.br
Extensão de um tipo vazio
<xs:complexType!name="CargaHorariaType>!!!!!<xs:attribute!name="horas"!type="xs:integer"/>!</xs:complexType>!
<xs:complexType!name="CargaHorariaComMinutosEFusoHorarioType>!!!!!<xs:extension!base="CargaHorariaType">!!!!!!!<xs:sequence>!!!!!!!!!<xs:element!ref="gmt"!maxOccurs="1">!!!!!!!!!!!!!<xs:simpleType>!!!!!!!!!!!!!!!!!<xs:restriction!base="xs:integer">!!!!!!!!!!!!!!!!!!!!!<xs:maxInclusive>12</xs:maxInclusive>!!!!!!!!!!!!!!!!!!!!!<xs:minInclusive>>12</xs:minInclusive>!!!!!!!!!!!!!!!!!!!!!<xs:restriction>!!!!!!!!!!!!!</xs:simpleType>!!!!!!!!!</xs:element>!!!!!!!</xs:sequence>!!!!!!!<xs:attribute!name="minutos"!type="xs:integer"/>!!!!!</xs:extension>!</xs:complexType>! + um atributo
10 ww
w.a
rgonavis
.com
.br
Restrição de tipos complexos
● Pode ser realizada através de
● Remoção ou restrição de atributos (escopo, valores permitidos)
● Redução de modelos de conteúdo complexos (eliminação de
elementos-filho)
● Redução de modelos de conteúdo simples (restrição de tipo de
dados)
● Exemplo: tornando um atributo positivo e obrigatório
<xs:complexType!name="CargaHorariaTypeObrigatoria">!!!!!<xs:simpleContent>!!!!!!!!!<xsd:restriction!base="CargaHorariaType">!!!!!!!!!!!!!<xsd:attribute!name="horas"!!!!!!!!!!!!!!!!!!type="xsd:positiveInteger"!use="required"!/>!!!!!!!!!</xsd:restriction>!!!!!</xs:simpleContent>!</xs:complexType>!
11 ww
w.a
rgonavis
.com
.br
Restrição de conteúdo complexo
● Requer a repetição de todo o modelo de
conteúdo que se deseja manter
● Elementos que não se repetirem no tipo derivado
serão eliminados
● Instâncias do tipo derivado também precisam
ser válidas em relação ao tipo base
● Restrições formalizadas no novo tipo devem ser
possíveis no tipo antigo
● Restrições não podem ampliar faixas de valores
definidas no tipo base: pode apenas mantê-las
inalteradas ou torná-las mais restritivas
12 ww
w.a
rgonavis
.com
.br
Exemplo: restrição de conteúdo complexo
<xs:complexType!name="CursoResumidoType">!!!!!<xs:complexContent>!!!!!!!!!<xs:restriction!base="CursoCompletoType">!!!!!!!!!!!!!<xs:sequence>!!!!!!!!!!!!!!!!!<xs:element!ref="titulo"/>!!!!!!!!!!!!!!!!!<xs:element!ref="carga>horaria"/>!!!!!!!!!!!!!!!!!<xs:element!ref="pre>requisito"/>!!!!!!!!!!!!!</xs:sequence>!!!!!!!!!</xs:restriction>!!!!!</xs:complexContent>!</xs:complexType>!
<xs:complexType!name="CursoCompletoType">!!!!!<xs:sequence>!!!!!!!!!<xs:element!ref="titulo"/>!!!!!!!!!<xs:element!ref="cargaDhoraria"/>!!!!!!!!!<xs:element!ref="preDrequisito"/>!!!!!!!!!<xs:element!ref="descricao"/>!!!!!!!!!<xs:element!ref="objetivo"/>!!!!!!!!!<xs:element!ref="topicos"/>!!!!!</xs:sequence>!</xs:complexType>!
13 ww
w.a
rgon
avis
.com
.br
Grupos de substituição
● Fundamentam-se na derivação de tipos para criar uma hierarquia de elementos
● Similar a linguagens orientadas a objeto
● Suporta polimorfismo!
● Permite declarar novos elementos como substitutos de esquemas e namespaces
● Herda-se o modelo de conteúdo, que pode ser alterado
● Exemplo
● Tipo base: <produto>
● Tipos de produto: <publicacao>, <roupa>, <veiculo> podem ser usados quando o esquema pede um <produto>
● Tipos de <publicacao>: <livro>, <revista>, <jornal> podem ser usados no lugar de <publicacao> ou de <produto>
14 ww
w.a
rgonavis
.com
.br
Como usar grupos de substituição
● Raiz da hierarquia
● Qualquer elemento (ou tipo) global
● Elemento (ou tipo) base
● Filhos da hierarquia
● Referem-se à raiz através do atributo
substitutionGroup
● Compatibilidade
● Tipo de membros de um grupo de substituição
precisam ter tipos iguais ou derivados da base
15 ww
w.a
rgonavis
.com
.br
Exemplo de grupos de substituição: tipos
● Declaração normal de uma hierarquia de tipos
<xs:complexType!name="ProdutoType">!!!!!<xs:sequence>!!!!!!!!!<xs:element!ref="preco"/>!!!!!!!!!<xs:element!ref="codigo"/>!!!!!</xs:sequence>!</xs:complexType>!
<xs:complexType!name="PublicacaoType">!!!!!<xs:complexContent>!!!!!!!!!<xs:extension!base="ProdutoType">!!!!!!!!!!!!!<xs:sequence>!!!!!!!!!!!!!!!!!<xs:element!name="autores"!type="AutoresType"/>!!!!!!!!!!!!!!!!!<xs:element!name="formato"!type="FormatoPubType"!/>!!!!!!!!!!!!!!!!!<xs:element!name="titulo"!type="xs:string"/>!!!!!!!!!!!!!</xs:sequence>!!!!!!!!!</xs:extension>!!!!!</xs:complexContent>!</xs:complexType>!
PublicacaoType!
ProdutoType!
16 ww
w.a
rgonavis
.com
.br
PublicacaoType!
ProdutoType!
ProdutoType! "dvdDType"!
Exemplos de grupos de substituição: elementos
<xs:element!name="dvd"!substitutionGroup="produto">!!<xs:complexType>!!!<xs:complexContent>!!!!<xs:extension!base="ProdutoType">!!!!!<xs:sequence>!!!!!!<xs:element!!name="formato"!!
! ! ! !!! !type="FormatoDVDType"!/>!!!!!</xs:sequence>!!!!</xs:extension>!!!</xs:complexContent>!!</xs:complexType>!</xs:element>!
<xs:element!name="produto"!!!!type="ProdutoType"/>!
<xs:element!name="publicacao"!type="PublicacaoType"!!!!!!!!!!!!!!!!!!!!!!!!!!!!substitutionGroup="produto"/>!
<xs:element!name="caderno"!substitutionGroup="produto"/>!
produto!
caderno!publicacao! dvd!
17 ww
w.a
rgonavis
.com
.br
Uso de grupos de substituição
!<produtos>!!!!!!!!!<produto>!!!!!!!!!!!!!<codigo>123</codigo>!!!!!!!!!!!!!<preco>10.00</preco>!!!!!!!!!</produto>!!!!!!!!!<publicacao>!!!!!!!!!!!!!<codigo>912</codigo>!!!!!!!!!!!!!<preco>31.00</preco>!!!!!!!!!!!!!<titulo>A!Origem!das!Especies</titulo>!!!!!!!!!!!!!<autores><autor>Charles!Darwin</autor></autores>!!!!!!!!!!!!!<formato!encadernacao="capaDdura"!dimensoes="16.3!12.5!2.8"!/>!!!!!!!!!</publicacao>!!!!!!!!!<dvd>!!!!!!!!!!!!!<codigo>778</codigo>!!!!!!!!!!!!!<preco>19.90</preco>!!!!!!!!!!!!!<formato!area="0"!/>!!!!!!!!!</dvd>!!!!!!!!!<caderno>!!!!!!!!!!!!!<codigo>834</codigo>!!!!!!!!!!!!!<preco>15.00</preco>!!!!!!!!!</caderno>!</produtos>!
18 ww
w.a
rgon
avis
.com
.br
Elementos e tipos abstratos e finais
● O controle de acesso em grupos de substituição pode ser declarado no tipo base ou elemento
● final="valor"
● Define o tipo ou elemento como final para diferentes tipos de derivação
● #all – impede qualquer tipo de derivação
● abstract="true"
● declara que um elemento é cabeça de um grupo de substituição mas não pode ser usado diretamente
● Elementos na instância só podem ser usados se forem de componentes derivados do grupo de substituição
1 ww
w.a
rgonavis
.com
.br
chaves
referências cruzadas
© 2002, 2005, 2008 Helder da Rocha ([email protected])
X170
2 ww
w.a
rgonavis
.com
.br
Identificadores
● Componentes que podem ser identificados por
chaves primárias ou identificadores unívocos
● Referenciáveis dentro ou fora do esquema ou
instância
● <xs:unique>, <xs:key> e <xs:keyref>
● Vale para elementos ou atributos
● Muito mais abrangentes que ID e IDREF (DTD)
● Identificador é aplicado em contexto localizado
através de XPath
● Pode ter um ou mais campos que compõem o
elemento ou chave unívoca
3 ww
w.a
rgon
avis
.com
.br
Identificador unívoco simples
● O elemento <xs:unique> define um elemento que tem conteúdo que não se repete
● considerando os outros elementos definidos no mesmo contexto
<xs:element*name="pedido"*type="PedidoType">*****<xs:unique*name="codigoProduto">*********<xs:selector*xpath="*/produto"/>*********<xs:field*xpath="@codigo"/>*****</xs:unique>*</xs:element>*
4 ww
w.a
rgonavis
.com
.br
Identificador unívoco composto
● É possível também definir como unívoco um
elemento com base nos valores de mais de um
campo (elemento ou atributo)
<xs:element*name="pedido"*type="PedidoType">***<xs:unique*name="codigoProdutoPedido">*******<xs:selector*xpath="*/pedido"/>*******<xs:field*xpath="itens/produto/@codigo"/>*******<xs:field*xpath="@codigo"/>***</xs:unique>*</xs:element>*
5 ww
w.a
rgonavis
.com
.br
<xs:key> e <xs:keyref>
● Chaves permitem que se realize um mapeamento
entre um campo unívoco e uma referência
● Com um par <xs:key> e <xs:reyref> pode-se
estabelecer ligações entre referências e elementos
● Chaves são definidas usando XPath
<xs:element*name="pedido"*type="PedidoType">*****<xs:keyref*name="codProdutoRef"*refer="codProduto">*********<xs:selector*xpath="itens/*"/>*********<xs:field*xpath="@codigo"/>*****</xs:keyref>*****<xs:key*name="codProduto">*********<xs:selector*xpath=".//produto"/>*********<xs:field*xpath="codigo"/>*****</xs:key>*</xs:element>*