Namespaces 1 Namespaces Dados XML são usados para intercâmbio entre organizações XML permite autores de documentos criarem suas próprias tags, definindo a origem dos elementos, atributos e tipos. Pode haver uma mesma tag com semântica diferenciada em diferentes organizações, dificultando a troca de informação. Ex.: Documento1: <veiculo> Palio </veiculo> Documento2: <veiculo> Jornal da Tarde </veiculo> Usa PI para associar nomes exclusivos a URI Permitem que seja usado um esquema de atribuição de nomes ao longo de um conjunto de documentos 2 Solução Primeira tentativa <Documento1:veiculo> Palio </Documento1:veiculo> Segunda tentativa <www.vendas.com.br/agencia:veiculo> Palio </www.vendas.com.br/agencia:veiculo> Solução final (uso de namespaces) <ag:agencia xmlns:ag=”www.vendas.com.br/agencia”> <ag:veiculo> Palio </ag:veiculo> 3 Examplo de Namespace <html:html xmlns:html=”...” xmlns:math=”...”> <html:title> George Soros </html:title> <html:h2> Counting ... </html:h2> <math:reln> ..... </math:reln> </html:html> 4 Namespace default <html xmlns=”...” xmlns:math=”...”> <title> George Soros </title> <h2> Contabilidade ... </h2> <math:reln> ..... </math:reln> </html> 5 Nome de Atributo com Namespace Atributos podem ter namespace Exemplo: <myLink xmlns:xlink=”...” xlink:type=”simple” ...... </myLink> 6 Exemplo de Namespace para Banco <banco xmlns:FB=‘http://www.FirstBank.com’> … <FB:agencia> <FB:nome>Centro </FB:nome> <FB:cidade>Maceió </FB:cidade> </FB:agencia> … </banco> 7 XML Schema 8 XML Schema Visa remediar as limitações dos DTDs Schemas são documentos XML Schemas ainda usam um DTD para serem validados Declaração default: <xs:schema xmlns:xs=“http://www.w3.org/2001/XMLSchema” 9 Propósito de XML Schemas Especificar: a estrutura de documentos “o elemento estudante contém os elementos matrícula, endereço, curso, nome, ... os tipos de dados de cada elemento/atributo “o elemento idade deve ser inteiro entre 0 e 130” 10 Motivação para XML Schemas Existe insastifação em usar DTDs: sintaxe diferente você escreve seu documento XML usando uma sintaxe e o DTD usando outra sintaxe capacidade limitada de tipos de dados DTDs suportam um conjunto muito limitado de tipos de dados. Não podemos dizer “o elemento <salario> deve ser entre 240 e 3000,00” Desejo de se ter um conjunto de tipos de dados compatíveis com aqueles encontrados nos banco de dados 11 Vantagens de XML Schemas XML Schemas são mais poderosos que DTDs: Tipos de dados melhor especificado +41 tipos e a capacidade de se criar tipos de dados definidos pelo usuário Escritos em XML (mesma linguagem dos documentos) Podem expressar conjuntos (sets): um elemento filho pode estar em qualquer ordem Podem especificar unicidade (chaves) Uso de técnicas de orientação a objetos 12 W3C XML Schema Recom. define 3 namespaces: www.w3.org/2001/XMLSchema www.w3.org/2001/XMLSchema-datatypes Vocabulário básico: element, attribute, complexType, etc. Contém tipos de dados pré-definidos (ex.date, time, etc.) www.w3.org/2001/XMLSchema-instance Contém atributos a serem usados nas instâncias de documentos 13 Basicamente ... Todos os elementos devem ser associados a tipos Os elementos atômicos (folhas da árvore XML) e atributos Tipos Básicos Tipos Simples Definição de tipos primitivos - data, número, string, etc Uso de simpleType Definição de estruturas simples a partir dos tipos básicos Os elementos compostos Tipos Complexos Uso de complexType Definição de estruturas complexas 14 Exemplo: Conversão do DTD CatalogoLivros.dtd para XML Schema <!ELEMENT CatalogoLivros(livro)+> <!ELEMENT livro(titulo, autor, data, isbn, editora) <!ELEMENT titulo (#PCDATA) <!ELEMENT autor (#PCDATA) <!ELEMENT data (#PCDATA) <!ELEMENT isbn (#PCDATA) <!ELEMENT editora (#PCDATA) 15 <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.publishing.org" xmlns="http://www.publishing.org"> <xs:element name="CatalogoLivros"> <xs:complexType> <xs:sequence> <xs:element ref=”livro" minOccurs=”1" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name=”livro"> <xs:complexType> <xs:sequence> <xs:element ref=”titulo" minOccurs="1" maxOccurs="1"/> <xs:element ref=”autor" minOccurs="1" maxOccurs="1"/> <xs:element ref=”data" minOccurs="1" maxOccurs="1"/> <xs:element ref="ISBN" minOccurs="1" maxOccurs="1"/> <xs:element ref=”editora" minOccurs="1" maxOccurs="1"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name=”titulo" type="xs:string"/> <xs:element name=”autor" type="xs:string"/> <xs:element name=”data" type="xs:string"/> <xs:element name="ISBN" type="xs:string"/> <xs:element name=“editora" type="xs:string"/> </xs:schema> 16 <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.publishing.org" xmlns="http://www.publishing.org”> <xs:element name="CatalogoLivros"> <xs:complexType> <xs:sequence> <!ELEMENT CatalogoLivros (livro)+> <xs:element ref=”livro" minOccurs=”1" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name=”livro"> <xs:complexType> <xs:sequence> <xs:element ref=”titulo" minOccurs="1" maxOccurs="1"/> <!ELEMENT livro (titulo, autor, data, <xs:element ref=”autor" minOccurs="1" maxOccurs="1"/> ISBN, editora)> <xs:element ref=”data" minOccurs="1" maxOccurs="1"/> <xs:element ref="ISBN" minOccurs="1" maxOccurs="1"/> <xs:element ref=”editora" minOccurs="1" maxOccurs="1"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name=”titulo" type="xs:string"/> <!ELEMENT titulo (#PCDATA)> <xs:element name=”autor" type="xs:string"/> <!ELEMENT autor (#PCDATA)> <xs:element name=”data" type="xs:string"/> <!ELEMENT data (#PCDATA)> <xs:element name="ISBN" type="xs:string"/> <!ELEMENT ISBN (#PCDATA)> <xs:element name=”editora" type="xs:string"/> <!ELEMENT editora (#PCDATA)> </xs:schema> 17 <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.publishing.org" xmlns="http://www.publishing.org”> <xs:element name="CatalogoLivros"> <xs:complexType> <xs:sequence> <xs:element ref=”livro" minOccurs=”1" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name=”livro"> <xs:complexType> <xs:sequence> <xs:element ref=”titulo" minOccurs="1" maxOccurs="1"/> <xs:element ref=”autor" minOccurs="1" maxOccurs="1"/> <xs:element ref=”data" minOccurs="1" maxOccurs="1"/> <xs:element ref="ISBN" minOccurs="1" maxOccurs="1"/> <xs:element ref=”editora" minOccurs="1" maxOccurs="1"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name=”titulo" type="xs:string"/> <xs:element name=”autor" type="xs:string"/> <xs:element name=”data" type="xs:string"/> <xs:element name="ISBN" type="xs:string"/> <xs:element name="editora" type="xs:string"/> </xs:schema> Todos XML Schemas têm "schema" como elemento raiz.. 18 <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.publishing.org" xmlns="http://www.publishing.org”> <xs:element name="CatalogoLivros"> <xs:complexType> <xs:sequence> <xs:element ref=”livro" minOccurs=”1" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name=”livro"> <xs:complexType> <xs:sequence> <xs:element ref=”titulo" minOccurs="1" maxOccurs="1"/> <xs:element ref=”autor" minOccurs="1" maxOccurs="1"/> <xs:element ref=”data" minOccurs="1" maxOccurs="1"/> <xs:element ref="ISBN" minOccurs="1" maxOccurs="1"/> <xs:element ref=”editora" minOccurs="1" maxOccurs="1"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name=”titulo" type="xs:string"/> <xs:element name=”autor" type="xs:string"/> <xs:element name=”data" type="xs:string"/> <xs:element name="ISBN" type="xs:string"/> <xs:element name="editora" type="xs:string"/> </xs:schema> Os elementos que são usados para criar um XML Schema vêm do XMLSchema namespace 19 <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.publishing.org” xmlns="http://www.publishing.org”> <xs:element name="CatalogoLivros"> <xs:complexType> <xs:sequence> <xs:element ref=”livro" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name=”livro"> <xs:complexType> <xs:sequence> <xs:element ref=”titulo" minOccurs="1" maxOccurs="1"/> <xs:element ref=”autor" minOccurs="1" maxOccurs="1"/> <xs:element ref=”data" minOccurs="1" maxOccurs="1"/> <xs:element ref="ISBN" minOccurs="1" maxOccurs="1"/> <xs:element ref=”editora" minOccurs="1" maxOccurs="1"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name=”titulo" type="xs:string"/> <xs:element name=”autor" type="xs:string"/> <xs:element name=”data" type="xs:string"/> <xs:element name="ISBN" type="xs:string"/> <xs:element name="editora" type="xs:string"/> </xs:schema> indica que os elementos declarados neste schema (CatalogoLivros, livro, titulo, autor, data, ISBN, editora) vão para este namespace 20 <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.publishing.org” xmlns="http://www.publishing.org”> <xs:element name="CatalogoLivros"> <xs:complexType> <xs:sequence> <xs:element ref=”livro" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name=”livro"> <xs:complexType> <xs:sequence> <xs:element ref=”titulo" minOccurs="1" maxOccurs="1"/> <xs:element ref=”autor" minOccurs="1" maxOccurs="1"/> <xs:element ref=”data" minOccurs="1" maxOccurs="1"/> <xs:element ref="ISBN" minOccurs="1" maxOccurs="1"/> <xs:element ref=”editora" minOccurs="1" maxOccurs="1"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name=”titulo" type="xs:string"/> <xs:element name=”autor" type="xs:string"/> <xs:element name=”data" type="xs:string"/> <xs:element name="ISBN" type="xs:string"/> <xs:element name="editora" type="xs:string"/> </xs:schema> O namespace default é http://www.publishing.org que é o targetNamespace! Este está referenciando uma declaração de um elemento livro. livro em qual namespace? Uma vez que não há um qualificador de namespace, é uma referência ao elemento livro no namespace default, que é o targetNamespace! 21 Como ligar uma instância XML a um XML Schema? No elemento raiz do documento XML, adicionar os atributos schemaLocation – necessário quando estamos usando um namespace associado ao nosso esquema – valor do atributo é o nome do namespace, um espaço em branco e o caminho para o arquivo XSD OU Neste caso, é necessário também declarar o namespace noNamespaceSchemaLocation – quando não usamos namespace – valor do atributo é o caminho para o arquivo XSD 22 Como ligar uma instância XML a um XML Schema? (exemplo) schemaLocation <report xmlns="http://www.example.com/Report" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.com/Report http://www.example.com/Report.xsd“> ... </report> noNamespaceSchemaLocation <endereco xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="endereco.xsd"> ... </endereco> 23 Referenciando um schema numa instância de um documento XML <?xml version="1.0"?> <CatalogoLivros xmlns ="http://www.publishing.org" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.publishing.org CatalogoLivros.xsd"> <livro> <titulo>Meninos de Rua</titulo> <autor>Jorge Amado</autor> <data>julho,1976 </data> <ISBN>94303-12021-43892</ISBN> <editora>Nossos Livros</editora> </livro> ... </CatalogoLivros> 24 Valores Default para minOccurs e maxOccurs O valor default para minOccurs é "1" O valor default para maxOccurs é "1" <element ref=”titulo" minOccurs="1" maxOccurs="1"/> Equivalentes! <element ref=”titulo"/> 25 Esquema alternativo ... <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.publishing.org" xmlns="http://www.publishing.org”> <xs:element name="CatalogoLivros"> <xs:complexType> <xs:sequence> <xs:element name=”livro" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name=”titulo" type="xs:string"/> <xs:element name=”autor" type="xs:string"/> <xs:element name=”data" type="xs:string"/> <xs:element name="ISBN" type="xs:string"/> <xs:element name=”editora" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> 26 Um tipo pode ser nomeado <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.publishing.org" xmlns="http://www.publishing.org”> <xs:element name="CatalogoLivros"> <xs:complexType> <xs:sequence> <xs:element name=”livro" type="CardCatalogueEntry" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> <xs:complexType name="CardCatalogueEntry"> <xs:sequence> <xs:element name=”titulo" type="xs:string"/> <xs:element name=”autor" type="xs:string"/> <xs:element name=”data" type="xs:string"/> <xs:element name="ISBN" type="xs:string"/> <xs:element name=”editora" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:schema> Tipo nomeado 27 Observação <xs:element name="A" type=”ttt"/> <xs:complexType name=”ttt"> <xs:sequence> <xs:element name="B" …/> <xs:element name="C" …/> </xs:sequence> </xs:complexType> Elemento A referencia o complexType ttt. é equivalente a <xs:element name="A"> <xs:complexType> <xs:sequence> <xs:element name="B" …/> <xs:element name="C" …/> </xs:sequence> </xs:complexType> </xs:element> Elemento A tem a definição complexType embutida na declaração do elemento. 28 Observação 2 Uma declaração de elemento pode ter um atributo type, ou um complexType elemento filho, mas não pode ter ambos. <xs:element name="A" type=”ttt"> <xs:complexType> … </xs:complexType> </xs:element> 29 Sumário de declaração de Elementos (2 formas) 1 <xs:element name="nome" type="type" minOccurs="int" maxOccurs="int"/> Um tipos simples Um inteiro Um inteiro não (ex.., xs:string) não negativo negativo ou "unbounded" ou o nome de um complexType Obs: minOccurs e maxOccurs podem ser usados apenas em declaração de elementos. 2 <xs:element name="nome" minOccurs="int" maxOccurs="int"> <xs:complexType> … </xs:complexType> </xs:element> 30 Problema: Como restringir os tipos? Suponha que queremos restringir o elemento ISBN da seguinte forma: ddddd-ddddd-ddddd ou d-ddd-ddddd-d ou d-dd-dddddd-d, onde 'd' significa 'digit' <xs:simpleType name="ISBNType"> <xs:restriction base="xs:string"> <xs:pattern value="\d{5}-\d{5}-\d{5}"/> <xs:pattern value="\d{1}-\d{3}-\d{5}-\d{1}"/> <xs:pattern value="\d{1}-\d{2}-\d{6}-\d{1}"/> </xs:restriction> </xs:simpleType> 31 <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.publishing.org” xmlns="http://www.publishing.org”> <xs:simpleType name="ISBNType"> <xs:restriction base="xs:string"> <xs:pattern value="\d{5}-\d{5}-\d{5}"/> <xs:pattern value="\d{1}-\d{3}-\d{5}-\d{1}"/> <xs:pattern value="\d{1}-\d{2}-\d{6}-\d{1}"/> </xs:restriction> </xs:simpleType> <xs:element name="CatalogoLivros"> <xs:complexType> <xs:sequence> <xs:element name=”livro" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name=”titulo" type="xs:string"/> <xs:element name=”autor" type="xs:string"/> <xs:element name=”data" type="xs:date"/> <xs:element name="ISBN" type="ISBNType"/> <xs:element name=”editora" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> 32 <xs:complexType> ou <xs:simpleType>? Use o elemento complexType quando quiser definir elementos filhos e/ou atributos de um elemento Use o elemento simpleType quando precisar criar um novo tipo que é um refinamento de um tipo embutido (string, integer, etc) 33 Criando seus próprios Datatypes Um novo datatype pode ser definido de um datatype existente (chamado tipo "base" ) através da especificação de valores para uma ou mais das facetas opcionais para o tipo base. Exemplo. O tipo primitivo string tem seis facetas opcionais: pattern enumeration length minLength maxlength whitespace (valores: preserve, replace, collapse) 34 Exemplo de criação de um novo Datatype através da especificação de valores de facetas <xs:simpleType name=”NumTelefone"> <xs:restriction base="xs:string"> <xs:length value="8"/> <xs:pattern value="\d{3}-\d{4}"/> </xs:restriction> </xs:simpleType> 35 Outro Exemplo <xs:simpleType name=”Cores-Brasil"> <xs:restriction base="xs:string"> <xs:enumeration value=”verde"/> <xs:enumeration value=”amarelo"/> <xs:enumeration value=”azul"/> <xs:enumeration value=”branco"/> </xs:restriction> </xs:simpleType> Cria um novo tipo chamado Cores-Brasil. Um elemento declarado deste tipo deve ter o valor verde, amarelo, azul ou branco. 36 Facetas do tipo Integer Facets: pattern enumeration whitespace maxInclusive maxExclusive minInclusive minExclusive precision 37 Exemplo <xs:simpleType name= "EarthSurfaceElevation"> <xs:restriction base="xs:integer"> <xs:minInclusive value="-1290"/> <xs:maxInclusive value="29035"/> </xs:restriction> </xs:simpleType> <xs:element name="elevation" type="EarthSurfaceElevation"/> Exemplo. Definindo um elemento elevation: <elevation>5240</elevation> 38 Tipos Derivados Podemos ter uma forma de especializar definições complexType. Conhecido como "tipos derivados" derivar por extensão: estender o complexType pai com mais elementos derivar por restrição: restringir o complexType pai através da restrição de alguns elementos para ter uma faixa de valores mais restrita, ou um número de ocorrências mais restrito. 39 <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.publishing.org” xmlns="http://www.publishing.org”> <xs:complexType name="Publicacoes"> <xs:sequence> <xs:element name=”titulo" type="xs:string" maxOccurs="unbounded"/> <xs:element name=”autor" type="xs:string" maxOccurs="unbounded"/> <xs:element name=”data" type="xs:date"/> </xs:sequence> </xs:complexType> <xs:complexType name=”livro"> <xs:complexContent> <xs:extension base=”Publicacoes" > <xs:sequence> <xs:element name="ISBN" type="xs:string"/> <xs:element name=”editora" type="xs:string"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> <xs:element name="CatalogoLivros"> <xs:complexType> <xs:sequence> <xs:element name=”livro" type=”livro" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> 40 Derivação por Restrição <xs:complexType name="Publicacao"> <xs:sequence> <xs:element name=”titulo" type="xs:string" maxOccurs="unbounded"/> <xs:element name=”autor" type="xs:string" maxOccurs="unbounded"/> <xs:element name=”date" type="xs:year"/> </xs:sequence> </xs:complexType> <xs:complexType name= "PublicacaoUnicoAutor"> <xs:complexContent> <xs:restriction base="Publicacao"> <xs:sequence> <xs:element name=”titulo" type="xs:string" maxOccurs="unbounded"/> <xs:element name=”autor" type="xs:string"/> <xs:element name=”data" type="xs:year"/> </xs:sequence> </xs:restriction> </xs:complexContent> </xs:complexType> 41 Proibindo Derivações <xs:complexType name="Publicacao" final="#all" …> Publicação não pode ser extendida or restringida <xs:complexType name="Publicacao" final="restriction" …> Publicacao não pode ser restringida <xs:complexType name="Publicação" final="extension" …> Publicação não pode ser extendida 42 Atributos Seja o DTD <!ELEMENT CatalogoLivros (livro)+> <!ELEMENT livro (titulo, autor+, data, ISBN, editora)> <!ATTLIST livro Categoria (autobiografia | nao-ficcao | ficcao) #REQUIRED EmEstoque (true | false) "false" Revisor CDATA " "> <!ELEMENT titulo (#PCDATA)> <!ELEMENT autor (#PCDATA)> <!ELEMENT data (#PCDATA)> <!ELEMENT ISBN (#PCDATA)> <!ELEMENT editora (#PCDATA)> 43 <xs:element name="CatalogoLivros"> <xs:complexType> <xs:sequence> <xs:element name=”livro" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name=”titulo" type="xs:string"/> <xs:element name=”autor" type="xs:string" maxOccurs="unbounded"/> <xs:element name=”data" type="xs:string"/> <xs:element name="ISBN" type="xs:string"/> <xs:element name=”editora" type="xs:string"/> </xs:sequence> <xs:attributeGroup ref="AtributosLivro"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:attributeGroup name="AtributosLivro"> <xs:attribute name="Categoria" use="required"> Categoria (autobiography | non-fiction | fiction) #REQUIRED <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="autobiografia"/> <xs:enumeration value="nao-ficcao"/> <xs:enumeration value="ficcao"/> </xs:restriction> </xs:simpleType> </xs:attribute> EmEstoque (true | false) "false" <xs:attribute name=”EmEstoque" type="xs:boolean" use="default" value="false"/> <xs:attribute name="Revisor" type="xs:string" use="default" value=" "/> Revisor CDATA " " </xs:attributeGroup> 44 Alternativamente ... <xs:element name=”livro" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name=”titulo" type="xs:string"/> <xs:element name=”autor" type="xs:string" maxOccurs="unbounded"/> <xs:element name=”data" type="xs:string"/> <xs:element name="ISBN" type="xs:string"/> <xs:element name="editora" type="xs:string"/> </xs:sequence> <xs:attribute name="Categoria" use="required"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="autobiografia"/> <xs:enumeration value="nao-ficcao"/> <xs:enumeration value="ficcao"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name=”EmEstoque" type="xs:boolean" use="default" value="false"/> <xs:attribute name="Revisor" type="xs:string" use="default" value=" "/> </xs:complexType> </xs:element> 45 Sumário de Declaração de Atributos (2 formas) 1 <xs:attribute name="nome" type=”tipo-simples" use=”como-usado" value="valor"/> xs:string xs:integer xs:boolean ... 2 required default fixed optional prohibited <xs:attribute name="nome" use=”como-usad" value="valor"> <xs:simpleType> <xs:restriction base=”tipo-simples"> <xs:facet value="valor"/> … </xs:restriction> </xs:simpleType> </xs:attribute> This attribute is only used with use="default" and use="fixed" 46 Observação sobre Atributos A declaração de atributos sempre vem após as declarações de elementos. Os atributos estão sempre com relação ao elemento que eles estão definidos (nested).<xs:element name=”A"> ”aa e ab são atributos de A" <xs:complexType> <xs:sequence> … </xs:sequence> <xs:attribute name=”aa" …/> <xs:attribute name=”ab" …/> </xs:complexType> </xs:element> 47 Elementos com Simple Content e Atributos Exemplo. Considere: <elevation units=“metros">5440</elevation> O elemento elevation tem duas restrições: - um simples (integer) conteúdo - um atributo chamado units Como declarar elevation? 48 Solução <xs:element name="elevation"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:integer"> <xs:attribute name="units" type="xs:string" use="required"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> 49 Solução mais completa (constraints) <xs:simpleType name="elevationType"> <xs:restriction base="xs:integer"> <xs:minInclusive value="0"/> <xs:maxInclusive value="12000"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="unitsType"> <xs:restriction base="xs:string"> <xs:enumeration value="feet"/> <xs:enumeration value="meters"/> </xs:restriction> </xs:simpleType> <xs:element name="elevation"> <xs:complexType> <xs:simpleContent> <xs:extension base="elevationType"> <xs:attribute name="units" type="unitsType" use="required"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> 50 Expressando Alternativas DTD: XML Schema: <!ELEMENT transporte (trem | aviao | carro)> <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.travel.org" xmlns="http://www.travel.org”> <xs:element name="transporte"> <xs:complexType> <xs:choice> <xs:element name="trem" type="xs:string"/> <xs:element name=”aviao" type="xs:string"/> <xs:element name=”carro" type="xs:string"/> </xs:choice> </xs:complexType> </xs:element> </xs:schema> 51 Expressando Repetições DTD: XML Schema: <!ELEMENT binary-string (zero | one)*> <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.binary.org" xmlns="http://www.binary.org”> <xs:element name="binary-string"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="zero" type="xs:unsignedByte" fixed="0"/> <xs:element name="one" type="xs:unsignedByte" fixed="1"/> </xs:choice> </xs:complexType> </xs:element> </xs:schema> 52 Expressando Ordem Qualquer <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.publishing.org" xmlns="http://www.publishing.org”> XML Schema: <xs:element name="CatalogoLivros"> <xs:complexType> <xs:sequence> <xs:element name=”livro" maxOccurs="unbounded"> <xs:complexType> Problema: criar um <xs:all> elemento livro, que <xs:element name=”titulo" type="xs:string"/> contenha autor, titulo, data, <xs:element name=”autor" type="xs:string"/> ISBN, e editora, <xs:element name=”data" type="xs:string"/> <xs:element name="ISBN" type="xs:string"/> em qualquer ordem. <xs:element name="editora" type="xs:string"/> </xs:all> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> 53 Elemento Vazio <!ELEMENT imagem EMPTY> DTD: <!ATTLIST imagem href CDATA #REQUIRED> Schema: <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.photography.org" xmlns="http://www.photography.org”> <xs:element name="galeria"> <xs:complexType> <xs:sequence> <xs:element name="imagem" maxOccurs="unbounded"> <xs:complexType> <xs:attribute name="href" type="xs:uriReference" use="required"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> 54 Exemplo de XMLSchema para Banco <xs:schema xmlns:xs=http://www.w3.org/2001/XMLSchema> <xs:element name=“banco” type=“BankType”/> <xs:element name=“conta”> <xs:complexType> <xs:sequence> <xs:element name=“numeroConta” type=“xs:string”/> <xs:element name=“nomeAgencia” type=“xs:string”/> <xs:element name=“saldo” type=“xs:decimal”/> </xs:sequence> </xs:complexType> </xs:element> ….. Definições de cliente e deposito <xs:complexType name=“BankType”> <xs:sequence> <xs:element ref=“conta” minOccurs=“0” maxOccurs=“unbounded”/> <xs:element ref=“cliente” minOccurs=“0” maxOccurs=“unbounded”/> <xs:element ref=“deposito” minOccurs=“0” maxOccurs=“unbounded”/> </xs:sequence> </xs:complexType> </xs:schema> 55 Exercício 3: Dado o documento XML crie um XMLSchema para o mesmo <?xml version='1.0' ?> <!DOCTYPE livro SYSTEM "livro.dtd"> <livro> <titulo> XML e Java </titulo> <autor> João Silva </autor> <conteudo> <capitulo focus="XML"> Introdução </capitulo> <capitulo focus="XML"> DTD </capitulo> <capitulo focus="XML"> Elementos </capitulo> <capitulo focus="Java"> SAX </capitulo> <capitulo focus="Java"> DOM </capitulo> <conteudo> <bibliografia> bla bla bla </bibliografia> <copyright> &ufcgCopyright; </copyright> </livro> 56 Exercício 4 Compare o DTD do exercício 2 com o XMLSchema do exercício 3 e escreva suas conclusões. 57