Upload
internet
View
110
Download
1
Embed Size (px)
Citation preview
InfoView2002 1
XML – eXtensible Markup Language
Prof. Dr. Cláudio BaptistaUFCG/DSC/SINBAD
[email protected]://www.lsi.dsc.ufcg.edu.br
InfoView2002 2
Roteiro
Introdução a XML XMLSchema DOM e SAX XSL XQuery
InfoView2002 3
Dados semi-estruturados ? Dados semi-estruturados: dados
heterogêneos e irregulares, auto-descritivos.
Banco de dados: originalmente, sistemas fechados, dedicados a gestão de dados regulares, cuja estrutura pouco evolui no tempo
Novas aplicações requerem mais flexibilidade de representação e estão constantemente evoluindo o esquema
Os modelos relacional e de objetos chegaram a seus limites
Introdução
InfoView2002 4
Dados estruturados São dados de um arquivo ou de
um banco de dados relacional, em que sua estrutura é conhecida a priori
Ex.:
Introdução
Create table empregado( matricula int, nome varchar(30), salario float, depto int)
InfoView2002 5
Dados não-estruturados São dados em que não há
nenhuma estrutura os definindo. São normalmente armazenados
em arquivos ou em colunas do tipo BLOB ou CLOB em SGBDs
Ex.: um texto em pdfuma imagem em jpgum video ou áudio
Introdução
InfoView2002 6
Dados semi-estruturados São dados em que uma parte há
estrutura e em outra não há nenhuma estrutura definida.
O esquema da parte estruturada está contido junto com o dado,
Ex.: Um email (parte estruturada: <to>, <subject>, <date>, etc.Parte não estruturada: o corpo da
mensagem)
Introdução
InfoView2002 7
A revolução da Web… 1989 - Primeiro Web Browser 1993 - Mosaic é difundido, há 50 web sites 1994 - Primeiras ferramentas de busca
(WWWW, webcrawler) 1996 - US$ 1M gastos em compras na Web,
presença em 150 países 1997 - 1 milhão de web sites 1998 - 300.000 web servers 2000 - mais de 1 bilhão de páginas web 2002 – quase 2,5 bilhões de páginas web
indexadas (google)
InfoView2002 8
A Web hoje… documentos HTML (em sua maioria) voltada para uso humano gerado automaticamente por
aplicações fácil de alcançar qualquer Web
page, de qualquer server, em qualquer plataforma
InfoView2002 9
O Segredo do sucesso de HTML
HTML é simples: todo mundo pode escrever HTML
HTML é textual: é legível, pode-se usar qualquer editor, ...
HTML é transportável em qualquer plataforma (o browser é a aplicação universal)
HTML conecta pedaços de informação através de hypertext links
InfoView2002 10
HTML
<h1> Bibliography </h1><p> <i> Foundations of Databases </i> Abiteboul, Hull, Vianu <br> Addison Wesley, 1995<p> <i> Data on the Web </i> Abiteoul, Buneman, Suciu <br> Morgan Kaufmann, 1999
InfoView2002 11
Resultado produzido
HTML descreve a apresentação
InfoView2002 12
Problemas com HTML Uma vez criado, um documento é ligado
a uma norma particular (ex. HTML 3.2 ) É necessário dispor de várias versões do
documento em função da mídia em que vai ser apresentado
A indexação de documentos só pode ser feita sobre a parte textual.
InfoView2002 13
HTML ... Um conjunto pré-definido e limitado de
tags, definidas por uma norma (HTML 2.0, 3.2, 4.0).
Estas tags possuem semânticas variadas: h1,..,h6, title, address, … dando as
indicações estruturais center,hr,b,i,big,small,… servem para
descrever a apresentação.
InfoView2002 14
Limites da Web … aplicações não devem consumir
HTML tecnologia de wrapper HTML é
instável (modifica-se a página => modifica-se o wrapper)
companhias se fundem, formam parcerias; necessitam de interoperabilidade de forma rápida
InfoView2002 15
As novas aplicações Comércio Eletrônico Protocolos "B2B" Bibliotecas digitais sistemas distribuídos …
precisamos de um "super HTML"
… estão surgindo ...
InfoView2002 16
XML ? « Buzz word » eXtensible Markup Language Uma linguagem de descrição de
documentos, definida por um organismo internacional W3C
Um conjunto de tecnologias derivadas: Xlink, Xpointer, Xschema, DOM, SAX, XSL,… Usados em aplicações como: SVG, SMIL,
MathML, MusicML, SOAP O esperanto da Web
InfoView2002 17
Web: Mudança de paradigma … Novo padrão Web XML:
XML gerado por aplicações XML consumido por aplicações
troca de dados entre plataformas: interoperabilidade
na empresa entre empresas
InfoView2002 18
XML
<bibliography> <book> <title> Foundations… </title> <author> Abiteboul </author> <author> Hull </author> <author> Vianu </author> <publisher> Addison Wesley </publisher> <year> 1995 </year> </book> …
</bibliography>
XML descreve o conteúdo
InfoView2002 19
XML: uma resposta única a necessidades variadas
HTML é usada como a lingagem universal de apresentação de documentos na Web, mas não é uma linguagem adaptada para descrever a estrutura destes documentos
Os sistemas de bases de dados atuais são muito rígidos para manipular dados cuja estrutura é irregular e evolui com o tempo.
InfoView2002 20
Os segredos de XML Como HTML:
simples, legível, fácil de aprender universal e transportável suportado pela W3C (indústria absorve!)
Mas, Além de HTML flexível : podemos representar qualquer tipo
de informação estensível: pode-se representar informação
de qualquer forma
InfoView2002 21
Noção estrutural
Princípio chave de SGML Idéia fundamental:
Considere um documento, é desejável separar completamente
as informações de estrutura das informações de apresentação.
InfoView2002 22
XML: herdeiro de SGML SGML Standard Generalized Markup
Language, norma ISO 8879:1986 Muito utilizada na indústria para as grandes
técnicas de documentação. Muito complexa para utilização de «público
em geral» SGML tem demonstrado as vantagens do
formato estrutural para a Gestão Eletrônica de Documentos (GED)
XML usa 10% de SGML para representar de forma eficaz 90% dos documentos
InfoView2002 23
Dois mundos se juntam na Web
Gestão de documentos
SGML
HTML
Documentaçãohipertexto
Gestão de dados
Bases de dados estruturados(relacionais e objeto)
Bases de dados semi-estruturadas
InfoView2002 24
Comunidade de BD pode ajudar ...
• otimização e processamento de consultas
• visões, transformações
• data warehouses, integração de dados
• mediadores, re-escrita de consultas
• eficiente armazenamento e indexação
InfoView2002 25
Origem de XML 1993: primeiros trabalhos sobre adaptação
das técnicas SGML à Web (Sperberg)."HTML to the Max: A Manifesto for Adding
SGML Intelligence to the World Wide Web" Junho 1996: criação de um grupo de
trabalho no W3C 10 fev. 1998: publicação da recomendação
para versão 1.0 da linguagem. http://www.w3.org/TR/REC-xml (2/98)
InfoView2002 26
Origem de XML Trabalho cooperativo de um grande
número de empresas e de pesquisadores reunidos no World Wide Web Consortium (W3C) 400 colaboradores da indústria, entre os quais
Oracle, IBM, Compaq, Xerox, Microsoft, etc.. Laboratórios de pesquisa: MIT - USA, INRIA -
França, universidade de Keio - Japão Objetivo: definição de um formalismo para
facilitar a troca de dados na Web
InfoView2002 27
Mandamentos iniciais: XML deverá ser diretamente utilizável
na Internet XML deverá suportar uma larga
variedade de aplicações XML deverá ser compatível com SGML A criação de páginas XML deverá ser
também o mais simples possível
InfoView2002 28
Mandamentos iniciais(2) Os documentos XML deverão ser de
grande legibilidade A criação de documentos deverá
ser rápida A sintaxe deverá ser formal e
concisa A concisão do código tem mínima
importância
InfoView2002 29
Resumindo: XML ...
XML é uma linguagem de
descrição e de troca de
documentos (semi-)estruturados
Exemplo de um documento
Campina GRande,20 de maio de 2001
Sr. Edilson Silva,Rua das Flores, 12581293 Caruaru
Bar da NoiteRua das Bodegas, s/n58106-920 C. Grande
Tel: 012133564Fax: 879765426
Objet: Dívida?
Prezado Senhor,
Bla bla bli, bli blo bla, kkkk vhlg vckjdhklbg fdskjbvhv feje slc ifehfe fhckh c jeflccj n khef iheznf jùkvbc lkhdklvn v
Aproveito do ensejo para renovar meus protestos de elevada estima e consideração.
assinatura
Rodapé
Logotipo
Data
Destinatário
Corpo
Rodapé
Cabeçalho
Objeto
Saudação
Forma Polida
Assinatura
Representação XML
<carta> . . .</carta>
<cabeca> . . .</cabeca><destinatario> <nome> Sr Edilson Silva </nome> <endereco> <rua> rua das Flores </rua> <cidade> Caruaru </cidade> </endereco></destinatario><objeto> bla bla </objeto><data> 20 Maio 2001 </data><saudacao> Prezado Senhor, </saudacao><corpo> . . .</corpo>
<para> Aqui é o primeiro parágrafo</para><para> aqui é o segundo ...</para>
<logotipo loc="logo-graph"/><endereco> &abrev-endereco; </endereco>
InfoView2002 32
Pontos importantes A representação desta carta em XML não
tem nenhuma indicação sobre a apresentação.
As numerosas propriedades gráficas ou tipográficas estão ausentes da fonte XML.
Estas propriedades serão definidas por intermédio de uma folha de estilo.
Uma folha de estilo é um conjunto de regras para especificar a realização concreta de um documento sobre uma mídia particular.
Objeto: Dívida
Prezado Senhot,Bla bla bli, bli blo bla, kkkk vhlg vckjdhklbg fdskjbvhv feje slc ifehfe fhckh c jeflccj n khef iheznf jùkvbc lkhdklvn v
.
sssinatura
Rodapé
<carta> <cabeca> . . . </cabeca>
<corpo> . . . </corpo></carta>
If carta then ...If cabeca then …If corps then
...If para then
Police new roman,size 12, skip first line
If … then …
Princípio de funcionamento das folhas de estilos
Bar da NoiteRua das Bodegas, s/n58106-920 C. Grande
Tel: 012133564Fax: 879765426 Campina GRande,
20 de maio de 2001
Sr. Edilson Silva,Rua das Flores, 12581293 Caruaru
InfoView2002 34
Descoberta de XML
Vantagens de XML
35
Estensibilidade e estrutura Em XML, um autor ou uma comunidade de autores inventam
livremente as tags que lhes pareçam úteis para marcar os componentes de um documento.
Exemplo: diversas formas de representar uma data <date> 5 janeiro 2000 </date> <date> <ano> 2000 </ano> <mes> 01 </mes> <dia> 05 </dia> </date> <date format='ISO-8601'> 2000-01-05 </date>
Grande liberdade de escolha das estruturas de dados facilita a troca de dados
comércio eletrônico, transações financeiras e comerciais, pesquisa e indústria de biotecnologias multimídia
Vantagens de XML
InfoView2002 36
Interoperabilidade Todos os dados podem ser vistos como
documentos XML e não mais como arquivos no formato X ou Y.
Consequências: Um servidor de documentos XML pode
responder a um conjunto de necessidades de uma organização.
Um simples editor de textos pode tratar o conjunto de dados de uma organização.
A interoperabilidade dos utilitários está assegurada.
Vantagens de XML
InfoView2002 37
Modularidade e reutilização Cada usuário é livre para definir suas
próprias estruturas de documento Um documento pode também estar
conforme as estruturas tipadas, chamadas DTD
Cada comunidade pode propor as estruturas normalizadas
A validação a um DTD permite a automatização no tratamento dos dados e assegura uma possibilidade de controle de integridade
Vantagens de XML
InfoView2002 38
Accesso às fontes de informaçãoheterogêneas
A consulta e troca de dados entre as base de dados heterogêneas é complexaXML contribui pare minimizar este problema: formato
de troca normalizado, genérico, independente de plataforma
A indexação e consulta de bases de documentos pode se beneficiar de informações estruturais e textuais.
pesquisa por palavras-chaves: Jorge+Amado retorna todos os documentos contendo as palavras Jorge e Amado, então as páginas pessoais de Pedro Amado cujo filho se chama Jorge.
pesquisa estrutural: pesquisa os documentos cujo autor é Jorge Amado (ie os documentos contendo um elemento autor, ou escrito-por contendo Jorge e Amado)
Vantagens de XML
InfoView2002 39
Descoberta de XML
Definição da linguagem XML 1.0
InfoView2002 40
Exemplos de documentos XML
<?xml version="1.0" standalone="yes" ?> <documento> <saudacao> Bom dia! </saudacao> </documento>
<documento> <saudacao> Bom dia! </saudacao> </documento>
<documento></documento> <documento/>
<documento> Bom dia!</documento>
XML 1.0
InfoView2002 41
Estrutura de um documento Um documento XML é composto de
um prólogo cuja presença é facultativa, mas fortemente aconselhada
uma árvore de elementos, obrigatória
comentários, seção CDATA e de instruções de tratamento, facultativos
<?xml version="1.0" standalone="yes" ?>
<documento> <saudacao> Bom dia! </saudacao> </documento>
XML 1.0
InfoView2002 42
O prólogo contém ... Uma declaração XML, facultativa
da forma:<?xml version="1.0" encoding="ISO-8859-1" standalone="yes">
indica ao processador que vai tratar o documento: a versão da linguagem XML utilizada o código de caracteres utilizado a existência de declarações exteriores ao documento
Uma declaração de tipo de documento, facultativa da forma
<!DOCTYPE exemplo SYSTEM "exemplo.dtd" [ declarações ]> indica a estrutura particular a qual deve estar de acordo um
documento
XML 1.0
InfoView2002 43
Estrutura de um DTD Um DTD pode compreender duas
partes uma parte externa
a parte externa é definida fora do documento. É referenciada por uma referência DTD, frequentemente uma URL. Este mecanismo permite assegurar uma reutilização de DTDs frequentemente utilizados.
uma parte interna utilizada para especializar um DTD externo
genérico ou redefinir certos tipos de elementos
XML 1.0
InfoView2002 44
Estrutura de um elemento (1) Um elemento é da forma:
<nome attr='valor'> conteúdo </nome> <nome> é a tag de abertura (XML é case sensitive!) </nome> é a tag de fechamento. A presença é obrigatória, a exceção
particular dos elementos nulos, denotado por <nome> </nome> ou <nome/>
conteúdo é o conteúdo de um elemento . Pode ser:
attr='valor' representa um conjunto eventualmente vazio de atributos, ou seja de pares (nome,valor). Os nomes dos atributos são únicos num elemento.
XML 1.0
uma mistura de texto e elementos instruções de tratamento comentários
vazio texto outros elementos
InfoView2002 45
Estrutura de um elemento (2) Um nome de elemento é uma sequência não nula de caracteres que pode
conter caracteres alfanuméricos undescore sinal de menos ponto caracter dois-pontos (:) é utilizado, mas com um sentido particular
deve satisfazer as seguintes restrições o primeiro caracter deve ser alfabético ou um undescore os três primeiros caracteres não devem formar uma cadeia cuja
representação em letras minúsculas seja "xml".
XML 1.0
InfoView2002 46
Estrutura de um elemento (2)
Exemplos de nomes de elementos
1998-catalogo
xmlSpecification
nome sociedade
_toto
Nome_sociedade
xsl:rule
X.11
incorretoscorretos
XML 1.0
InfoView2002 47
Sintaxe dos atributos Um atributo é um par nome='valor' que permite
de caracterizar um elemento. Um elemento pode ter vários atributos. Neste caso, os pares nome='valor' serão separados por um espaço.
Exemplos <relatorio lingua= ’pt' ult-modif='08/07/99'> <anuario generator='SQL2XML V2.0'
update='07.08.99'> O nome de um atributo obedece as mesmas
regras que o nome de um elemento O valor de um atributo é uma string entre
aspas(") ou apóstrofos simples ('). Um valor de atributo não deve conter os caracteres ^, % e &.
XML 1.0
InfoView2002 48
Seção CDATA
Uma seção CDATA instrui o parser a ignorar os caracteres de markup
Exemplo:<![CDATA[ *p = &q; b = (i <= 3); ]]>
Entre o início da seção, <![CDATA[ e o fim da seção, ]]>, todos os caracteres são passados diretamente para a aplicação, sem interpretação.A única string que não pode ocorrer numa seção CDATA é ]]>.
InfoView2002 49
Comentários
Comentários iniciam com ”<!--” e terminam com ”-->”. (só não podem conter o string ”--”).
Ex.: <!-- Isto é um comentário -->
Comentários podem ser colocados em qualquer linha do documento.
InfoView2002 50
Árvore de elementosUm documento XML contém uma árvore de
elementos, com as seguintes restrições:
Existe num documento um único elemento pai que contém todos os outros. É a raiz do documento.
Todo elemento distinto da raiz é totalmente incluído dentro de seu pai. Assim:
<p> <b> bla bla </p> bla </b> não é uma estrutura XML.
XML 1.0
InfoView2002 51
Documentos bem formados
Um documento é dito bem formado se: está de acordo com as regras sintáticas de XML
(tags são aninhadas propriamente e atributos são únicos)
<?xml version="1.0" standalone="yes" ?>
<documento> <saudacao> Bom dia! </saudacao> </documento>
Ex. de uma documento não bem formado:<documento> <saudacao> Bom dia!</documento></saudacao>
XML 1.0
InfoView2002 52
Documentos válidos Um documento é dito válido se:
seu prólogo contém uma declaração de tipo de documento
sua árvore de elementos respeita a estrutura definida pelo DTD
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?>
<!DOCTYPE documento [ <!ELEMENT documento (saudacao)> <!ELEMENT saudacao (#PCDATA)>]><documento> <saudacao> Bom dia! </saudacao> </documento>
XML 1.0
InfoView2002 53
Noção de DTD Um documento válido deve conter uma declaração de tipo de
documento. Esta declaração pode fazer referência, por intermédio de uma URL a um arquivo externo. Este arquivo é chamado de DTD (Definição de Tipo de Documento).
Exemplo
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?> <!DOCTYPE documento SYSTEM "acolhida.dtd"><documento> <saudacao> Bom dia! </saudacao> </documento>
XML 1.0
InfoView2002 54
Noção de DTD
XML 1.0
<!–- Arquivo acolhida.dtd. Exemplo de DTD simples --><!–- Autor: Cláudio Baptista --><!–- Data: 18/setembro/2002-->
<!–- a declaração XML não é obrigatória dentro de um DTD --><!–- permite assegurar que os documentos que a referenciam --> <!–- utilizam a mesma versão de XML --> <?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?>
<!–- Definição do elemento raiz --><!ELEMENT documento (saudacao)>
<!–- Um elemento saudacao contém texto --><!ELEMENT saudacao (#PCDATA)>
InfoView2002 55
Conteúdo de um DTD Um DTD pode conter as
declarações de elementos de listas de atributos de entidades gerais de entidades parametrizadas de notações
como também comentários
XML 1.0
InfoView2002 56
Declaração de elemento Uma declaração de elemento é da forma
<!ELEMENT nome modelo> ELEMENT é uma palavra-chave e se escreve
imperativamente em maiúsculas nome é um nome válido de um elemento modelo é o modelo de conteúdo deste elemento.
Distinguimos cinco modelos de conteúdo elementos dados misto livre vazio
XML 1.0: elementos
InfoView2002 57
Modelo de conteúdo de elementos (1)
Sequência de elementos filhos ( .., .., ..) Exemplo
<!ELEMENT capitulo (titulo,intro,secao)> Um elemento capitulo cujo conteúdo, imperativamente
e nesta ordem, contém sub-elementos titulo, intro e secao.
Alternativa ( ..| ..| ..) Exemplo
<!ELEMENT capitulo (titulo,intro,(secao|secoes))>
Indicadores de ocorrência *,+,?Um nome de elemento pode ter um indicador de orrorrência:
p* : p pode ocorrer zero, uma ou várias vezes dentro do conteúdo de um instância
p+ : p pode ocorrer uma ou várias vezesp? : p pode ocorrer zero ou uma vez
InfoView2002 58
Modelo de conteúdo de elementos (2)
Exemplos<!ELEMENT capitulo (
titulo,
intro?,
secao+ ) >
<!ELEMENT secao (
titulo-secao,
texto-secao ) >
<!ELEMENT texto-secao (p|a)* >
InfoView2002 59
Modelo de conteúdo de dados A presença de dados no conteúdo
de um elemento é especifidada pela palavra-chave #PCDATA
Exemplo<!ELEMENT p (#PCDATA) >
InfoView2002 60
Modelo de conteúdo misto Este modelo permite definir os modelos de
conteúdo podendo misturar dados e elementos Forma do modelo
(#PCDATA | nome1 | …|nomen)* Exemplos de declarações
<!ELEMENT p (#PCDATA | negrito | italico | sublinhado)* ><!ELEMENT negrito (#PCDATA|italico|sublinhado)* ><!ELEMENT italico (#PCDATA) ><!ELEMENT sublinhado (#PCDATA) >
Exemplo de uso <p> um parágrafo pode conter texto <negrito> em
evidência </negrito> ou em <italico> itálico </italico></p>
InfoView2002 61
Modelo de conteúdo livre (1) Um elemento pode ser definido como sendo um
conteúdo qualquer, desde que este conteúdo respeite as regras gerais da linguagem XML.
Exemplo<!ELEMENT qualquer ANY>
Para que o conteúdo de um elemento de modelo de conteúdo livre seja válido, é necessário que, se ele contiver elementos, estes sejam declarados num DTD
InfoView2002 62
Modelo de conteúdo livre (2)
Utilidade: este modelo de conteúdo é particularmente útil quando da criação de um DTD complexo
Exemplo<!ELEMENT relatorio ANY><!ELEMENT capitulo ANY><!ELEMENT secao ANY><!ELEMENT titulo-secao ANY><!ELEMENT ilustracao ANY><!ELEMENT bibliografia ANY><!ELEMENT indice ANY><!ELEMENT p ANY><!ELEMENT negrito (#PCDATA)><!ELEMENT titulo (#PCDATA)><!ELEMENT autor (prenome+,nome)><!ELEMENT nome (#PCDATA)><!ELEMENT prenome (#PCDATA)>
InfoView2002 63
Modelo de conteúdo vazio
Um elemento pode ser declarado como obrigatoriamente vazio, usando a palavra-chave EMPTY.
Exemplo de declarações<!ELEMENT p (#PCDATA|bibref)* ><!ELEMENT bibref EMPTY><!ATTLIST bibref ref IDREF #REQUIRED>
Exemplo de utilização<p> para uma definição precisa, veja <bibref ref='REC-xml-19980210'/> </p>
InfoView2002 64
Modelo de conteúdo vazio
Observações: quando o modelo de conteúdo de um
elemento é o modelo vazio, deve obrigatoriamente obedecer a sintaxe <nome/>
não é possível misturar EMPTY a uma outra construção de modelo de conteúdo
InfoView2002 65
Declaração de atributos Um atributo é um par nome-valor
associado a um elemento uma declaração de atributos num
DTD permite especificar os atributos que poderão ou deverão estar associados às instâncias dos elementos.
Forma da declaração<!ATTLIST nome-elemento nome-atributo tipo-atributo declaração-default>
XML 1.0: atributos
InfoView2002 66
Declaração de atributos Exemplos
<!ELEMENT ex1 (#PCDATA)>
<!ATTLIST ex1 lang NMTOKEN #IMPLIED >
<!ATTLIST ex1 target ID #IMPLIED >
<!ATTLIST ex1 nb (1 | 2 | 3) '1'>
equivalente a<!ATTLIST ex1 lang NMTOKEN #IMPLIED >
target ID #IMPLIED >
nb (1 | 2 | 3) '1'>
InfoView2002 67
Tipo de atributo O tipo de atributo pode ser:
CDATA: o valor do atributo é uma cadeia de caracteres
ID ou IDREF: permite definir um identificador para um documento
Uma lista de escolhas num conjunto de tokens, ou identificadores lógicos
NMTOKEN ou NMTOKENS: abreviação de Name Token. Permite ao atributo de ter seu valor de um conjunto de nomes simbólicos.
ENTITY ou ENTITIES: permite que um atributo tome como valor o nome de uma entidade externa não XML
NOTATION: define um atributo de notação
XML 1.0: atributos
InfoView2002 68
Declaração default Possui quatro formas
valor por default do atributo #REQUIRED: cada instância deverá ter um
atributo deste nome. Não aceita valor default.
#IMPLIED: presença facultativa. Não aceita valor default.
#FIXED: fixa o valor deste atributo para toda instância.
XML 1.0: atributos
InfoView2002 69
Exemplos (1) Atributo CDATA
<!ATTLIST f att1 CDATA #FIXED '<toto>' >O atributo att1 dos elementos de tipo f tem um valorr constante: o string <toto>.
Atributo enumerado Exemplo 1
<!ELEMENT data (#PCDATA) ><!ATTLIST data formato (ANSI | ISO | BR) #REQUIRED><data formato= ’BR'> 24 Maio 1998 </data><data formato='ISO'> 1998-05-24 </data>O atributo formato é obrigatório e deve ter valores do tipo ANSI, ISO ou BR
Exemplo 2<!ELEMENT list (item,item+)><!ELEMENT item (list|#PCDATA)><!ATTLIST list type (ord | num | alpha) 'ord'><list type='alpha'> <item> Maria </item> <item> Pedro </item> <item> José </item></list>
XML 1.0: atributos
InfoView2002 70
Exemplos (2) Atributos ID e IDREF
Estes tipos de atributos permitem de criar uma referência a um documento<!–- declaração do element secao --><!–- o atributo de identificação de secao --><!–- target é optional --><!ELEMENT secao (#PCDATA|xref)* ><!ATTLIST secao target ID #IMPLIED >
<!–- declaracao do elemento xref --><!ELEMENT xref EMPTY ><!ATTLIST xref ref IDREF #REQUIRED>
<secao target='X321'> conteúdo de uma seção </secao><secao> outra seção. Faz referência à seção X321 <xref ref='X321'/>
</secao>
Obs.: nós não referenciamos de fato uma seção, mas um elemento do documento que possui um atributo do tipo ID e cujo valor é X321.
XML 1.0: atributos
InfoView2002 71
Entidades internas Entidades pré-definidas
certos caracteres, como < > & ' " não podem ser utilizados dentro do texto de um documento
estes caracteres devem ser representados por seus códigos pré-definidos, chamadas entidades pré-definidas<: <
>: >
&: &
XML 1.0: entidades
InfoView2002 72
Entidades internas Entidades definidas pelo usuário
é possível declarar as entidades dentro do DTD esta declaração tem a forma
<!ENTITY nome-entidade "valor-entidade">
Exemploa declaração seguinte
<!DOCTYPE livro [ <!ENTITY copyright "© Tropical Editition">]><livro> ©right; </livro>
produzirá© Tropical Editions
observação: 00A9 é o código Unicode do caracter ©
XML 1.0: entidades
InfoView2002 73
Entidades externas endereçadas por URL
Exemplo<?xml version='1.0' ?><!DOCTYPE livro [ <!ENTITY capitulo1 SYSTEM "chap1.xml"> <!ENTITY capitulo2 SYSTEM "chap2.xml"> <!ENTITY autor "Maria Luiza Baptista">]><livro> <titulo> XML para iniciantes </titulo> <autor> &autor; </autor> <intro> Era uma vez uma Web… </intro> &capitulo1; &capitulo2;</livro>
Restrição: as entidades externas devem ser documentos bem formados
InfoView2002 74
Notações e entidades não XML
Exemplo<!DOCTYPE exemplo [ <!NOTATION jpeg SYSTEM "/usr/local/bin/xview"> <!ENTITY foto-ferias SYSTEM "./fotos/foto1.jpg" NDATA jpeg><!ELEMENT exemplo (foto)><!ELEMENT foto EMPTY><!ATTLIST foto img ENTITY #REQUIRED>
]><exemplo> <foto img='foto-ferias'/></exemplo> A declaração de notação associa ao formato jpeg a aplicação xview
que poderá ser utilizada em extensão da aplicação XML. A declaração da entidade foto-ferias indica que o conteúdo dos
dados está situado no arquivo foto1.jpg A palavra-chave NDATA indica que este arquivo é de um formato não
XML
InfoView2002 75
Exemplo<?xml version='1.0' ?><!DOCTYPE db [ <!ELEMENT db (pessoa*)> <!ELEMENT pessoa (nome, idade, email)> <!ELEMENT nome (#PCDATA)><!ELEMENT idade (#PCDATA)><!ELEMENT email (#PCDATA)>
]><db> <pessoa> <nome> Pedro Maia </nome>
<idade> 33 </idade><email> [email protected] </email>
</pessoa> <pessoa> <nome> Ana Maria </nome>
<idade> 24 </idade><email> [email protected] </email>
</pessoa> <pessoa> . . . </pessoa></db>
XML 1.0: Exemplos
InfoView2002 76
DTDs como esquemas
ExemploSeja o esquema r1(a, b, c) e r2 (c, e)<db> <r1> <a> a1 </a> <b> b1 </b> <c> c1 </c> </r1>
<r1> <a> a2 </a> <b> b2 </b> <c> c2 </c> </r1> <r2> <c> c1 </c> <d> d1 </d> </r2> <r2> <c> c2 </c> <d> d3 </d> </r2>
</db><!DOCTYPE db[<!ELEMENT (r1*|r2*)><!ELEMENT r1(a,b,c)><!ELEMENT r2(c,d)><!ELEMENT a (#PCDATA)><!ELEMENT b (#PCDATA)><!ELEMENT c (#PCDATA)><!ELEMENT d (#PCDATA)>]>
InfoView2002 77
<?xml version="1.0"?><!ELEMENT EMAIL (TO+, FROM, CC*, BCC*, SUBJECT?, BODY?)><!ATTLIST EMAIL LANGUAGE (Western|Greek|Latin|Universal) "Western" ENCRYPTED CDATA #IMPLIED PRIORITY (NORMAL|LOW|HIGH) "NORMAL">
<!ELEMENT TO (#PCDATA)><!ELEMENT FROM (#PCDATA)><!ELEMENT CC (#PCDATA)>
<!ELEMENT BCC (#PCDATA)><!ATTLIST BCC HIDDEN CDATA #FIXED "TRUE">
<!ELEMENT SUBJECT (#PCDATA)><!ELEMENT BODY (#PCDATA)>
<!ENTITY SIGNATURE "Mattheus Baptista">
XML 1.0
Exemplo de DTD
InfoView2002 78
Limitações de DTDs como esquemas
DTD impõe ordem Não existe a noção de tipos de dados atômicos (int,
float, etc) Não podemos especificar uma faixa de valores de
domínio IDREF não é relacionado a um tipo. Tipos são associados com tags => elementos com
mesmo nome porém pertencendo a diferentes tipos (nome de pessoa e nome de um curso) não podem usar o mesmo elemento nome. Nesta caso ou redefinimos nomePessoa e nomeCurso ou usamo namespaces com os qualificadores, pessoa:nome e curso:nome
InfoView2002 79
Namespaces
InfoView2002 80
Namespaces XML permite autores de documentos criarem
suas próprias tags => pode haver uma mesma tag com semântica diferenciada
Ex.: Documento1: <assunto> Bioinformatica </assunto> Documento2: <assunto> Animais </assunto>
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
InfoView2002 81
Solução
Primeira tentativa
<Documento1:assunto> Bioinformatica </Documento1:assunto>
Segunda tentativa<www.lsi.dsc.ufcg.edu.br/cursos:assunto>
Bioinformatica</www.lsi.dsc.ufcg.edu.br/cursos:assunto>
Solução final (uso de namespaces) <curso:curso xmlns:curso=”www.lsi.dsc.ufcg.edu.br/cursos”>
<curso:assunto> Bioinformatica </curso:assunto>
InfoView2002 82
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>
InfoView2002 83
Namespace default
<html xmlns=”...” xmlns:math=”...”>
<title> George Soros </title>
<h2> Contabilidade ... </h2>
<math:reln>
.....
</math:reln>
</html>
InfoView2002 84
Nome de Atributo com Namespace
Atributos podem ter namespace Exemplo:
<myLink xmlns:xlink=”...”
xlink:type=”simple”
......
</myLink>
InfoView2002 85
XML Schema
InfoView2002 86
XML Schema Visa remediar as limitações dos DTDs Schemas são documentos XML Por ser mais recente ainda não é
suportado por muitos parsers Schemas ainda usam um DTD para ser
validado Declaração default:
<xsd:schema xmlns:xsd=“http://www.w3.org/2000/10/XMLSchema”
InfoView2002 87
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”
InfoView2002 88
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 0 e 3000,00”
Desejo de se ter um conjunto de tipos de dados compatíveis com aqueles encontrados nos banco de dados
InfoView2002 89
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 Pode especificar unicidade (chaves) Uso de técnicas de orientação a objetos
InfoView2002 90
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)
InfoView2002 91
<?xml version="1.0"?><xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.publishing.org" xmlns="http://www.publishing.org"> <xsd:element name="CatalogoLivros"> <xsd:complexType> <xsd:sequence> <xsd:element ref=”livro" minOccurs=”1" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name=”livro"> <xsd:complexType> <xsd:sequence> <xsd:element ref=”titulo" minOccurs="1" maxOccurs="1"/> <xsd:element ref=”autor" minOccurs="1" maxOccurs="1"/> <xsd:element ref=”data" minOccurs="1" maxOccurs="1"/> <xsd:element ref="ISBN" minOccurs="1" maxOccurs="1"/> <xsd:element ref=”editora" minOccurs="1" maxOccurs="1"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name=”titulo" type="xsd:string"/> <xsd:element name=”autor" type="xsd:string"/> <xsd:element name=”data" type="xsd:string"/> <xsd:element name="ISBN" type="xsd:string"/> <xsd:element name=“editora" type="xsd:string"/></xsd:schema>
InfoView2002 92
<?xml version="1.0"?><xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.publishing.org" xmlns="http://www.publishing.org”>
<xsd:element name="CatalogoLivros"> <xsd:complexType> <xsd:sequence> <xsd:element ref=”livro" minOccurs=”1" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name=”livro"> <xsd:complexType> <xsd:sequence> <xsd:element ref=”titulo" minOccurs="1" maxOccurs="1"/> <xsd:element ref=”autor" minOccurs="1" maxOccurs="1"/> <xsd:element ref=”data" minOccurs="1" maxOccurs="1"/> <xsd:element ref="ISBN" minOccurs="1" maxOccurs="1"/> <xsd:element ref=”editora" minOccurs="1" maxOccurs="1"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name=”titulo" type="xsd:string"/> <xsd:element name=”autor" type="xsd:string"/> <xsd:element name=”data" type="xsd:string"/> <xsd:element name="ISBN" type="xsd:string"/> <xsd:element name=”editora" type="xsd:string"/></xsd:schema>
<!ELEMENT titulo (#PCDATA)><!ELEMENT autor (#PCDATA)><!ELEMENT data (#PCDATA)><!ELEMENT ISBN (#PCDATA)><!ELEMENT editora (#PCDATA)>
<!ELEMENT livro (titulo, autor, data, ISBN, editora)>
<!ELEMENT CatalogoLivros (livro)+>
InfoView2002 93
<?xml version="1.0"?><xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.publishing.org" xmlns="http://www.publishing.org”> <xsd:element name="CatalogoLivros"> <xsd:complexType> <xsd:sequence> <xsd:element ref=”livro" minOccurs=”1" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name=”livro"> <xsd:complexType> <xsd:sequence> <xsd:element ref=”titulo" minOccurs="1" maxOccurs="1"/> <xsd:element ref=”autor" minOccurs="1" maxOccurs="1"/> <xsd:element ref=”data" minOccurs="1" maxOccurs="1"/> <xsd:element ref="ISBN" minOccurs="1" maxOccurs="1"/> <xsd:element ref=”editora" minOccurs="1" maxOccurs="1"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name=”titulo" type="xsd:string"/> <xsd:element name=”autor" type="xsd:string"/> <xsd:element name=”data" type="xsd:string"/> <xsd:element name="ISBN" type="xsd:string"/> <xsd:element name="editora" type="xsd:string"/></xsd:schema>
Todos XML Schemas têm "schema" como elemento raiz..
InfoView2002 94
<?xml version="1.0"?><xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.publishing.org" xmlns="http://www.publishing.org”> <xsd:element name="CatalogoLivros"> <xsd:complexType> <xsd:sequence> <xsd:element ref=”livro" minOccurs=”1" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name=”livro"> <xsd:complexType> <xsd:sequence> <xsd:element ref=”titulo" minOccurs="1" maxOccurs="1"/> <xsd:element ref=”autor" minOccurs="1" maxOccurs="1"/> <xsd:element ref=”data" minOccurs="1" maxOccurs="1"/> <xsd:element ref="ISBN" minOccurs="1" maxOccurs="1"/> <xsd:element ref=”editora" minOccurs="1" maxOccurs="1"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name=”titulo" type="xsd:string"/> <xsd:element name=”autor" type="xsd:string"/> <xsd:element name=”data" type="xsd:string"/> <xsd:element name="ISBN" type="xsd:string"/> <xsd:element name="editora" type="xsd:string"/></xsd:schema>
Os elementos quesão usados paracriar um XML Schema vêm doXMLSchemanamespace
InfoView2002 95
<?xml version="1.0"?><xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.publishing.org” xmlns="http://www.publishing.org”> <xsd:element name="CatalogoLivros"> <xsd:complexType> <xsd:sequence> <xsd:element ref=”livro" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name=”livro"> <xsd:complexType> <xsd:sequence> <xsd:element ref=”titulo" minOccurs="1" maxOccurs="1"/> <xsd:element ref=”autor" minOccurs="1" maxOccurs="1"/> <xsd:element ref=”data" minOccurs="1" maxOccurs="1"/> <xsd:element ref="ISBN" minOccurs="1" maxOccurs="1"/> <xsd:element ref=”editora" minOccurs="1" maxOccurs="1"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name=”titulo" type="xsd:string"/> <xsd:element name=”autor" type="xsd:string"/> <xsd:element name=”data" type="xsd:string"/> <xsd:element name="ISBN" type="xsd:string"/> <xsd:element name="editora" type="xsd:string"/></xsd:schema>
indica que oselementos declaradosneste schema(CatalogoLivros,livro, titulo, autor, data, ISBN, editora)vão para este namespace
InfoView2002 96
<?xml version="1.0"?><xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.publishing.org” xmlns="http://www.publishing.org”> <xsd:element name="CatalogoLivros"> <xsd:complexType> <xsd:sequence> <xsd:element ref=”livro" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name=”livro"> <xsd:complexType> <xsd:sequence> <xsd:element ref=”titulo" minOccurs="1" maxOccurs="1"/> <xsd:element ref=”autor" minOccurs="1" maxOccurs="1"/> <xsd:element ref=”data" minOccurs="1" maxOccurs="1"/> <xsd:element ref="ISBN" minOccurs="1" maxOccurs="1"/> <xsd:element ref=”editora" minOccurs="1" maxOccurs="1"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name=”titulo" type="xsd:string"/> <xsd:element name=”autor" type="xsd:string"/> <xsd:element name=”data" type="xsd:string"/> <xsd:element name="ISBN" type="xsd:string"/> <xsd:element name="editora" type="xsd:string"/></xsd:schema>
Este está referenciando uma declaração de um elemento livro.livro em qualnamespace? Uma vez quenão há um qualificador de namespace, é umareferência ao elemento livro no namespace default, que é o targetNamespace!
O namespace default éhttp://www.publishing.orgque é o targetNamespace!
InfoView2002 97
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/2000/10/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>
1. O uso de um namespace default, diz ao schema-validator que todos os elementos usados nestedocument vêm do publishing namespace.2. schemaLocation indica para o schema-validator que o namespace http://www.publishing.org está definido em CAtalogoLivros.xsd.3. Diz ao schema-validator que o atributo schemaLocation usado pertence ao the namespace schema instance namespace.
InfoView2002 98
Referenciando um schema num documento XML
CatalogoLivros.xml CatalogoLivros.xsd
targetNamespace="A"schemaLocation="A CatalogoLivros.xsd"
- define elementos no namespace A
- usa elementos do namespace A
InfoView2002 99
Há multiplos níveis de verificação
CatalogoLivros.xml CatalogoLivros.xsd XMLSchema.xsd(schema-for-schemas)
Valida se o documento xml estáconforme as regras descritasem CatalogLivros.xsd
Valida se CatalogoLivros.xsd é um documentoschema válido, i.e., está conformecom as regras descritas noschema-for-schemas
InfoView2002 100
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"/>
<element ref=”titulo"/>
Equivalentes!
InfoView2002 101
Esquema alternativo ...<?xml version="1.0"?><xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.publishing.org" xmlns="http://www.publishing.org”> <xsd:element name="CatalogoLivros"> <xsd:complexType> <xsd:sequence> <xsd:element name=”livro" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name=”titulo" type="xsd:string"/> <xsd:element name=”autor" type="xsd:string"/> <xsd:element name=”data" type="xsd:string"/> <xsd:element name="ISBN" type="xsd:string"/> <xsd:element name=”editora" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element></xsd:schema>
102
Um tipo pode ser nomeado
<?xml version="1.0"?><xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.publishing.org" xmlns="http://www.publishing.org”> <xsd:element name="CatalogoLivros"> <xsd:complexType> <xsd:sequence> <xsd:element name=”livro" type="CardCatalogueEntry" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:complexType name="CardCatalogueEntry"> <xsd:sequence> <xsd:element name=”titulo" type="xsd:string"/> <xsd:element name=”autor" type="xsd:string"/> <xsd:element name=”data" type="xsd:string"/> <xsd:element name="ISBN" type="xsd:string"/> <xsd:element name=”editora" type="xsd:string"/> </xsd:sequence> </xsd:complexType></xsd:schema>
Tipo nomeado
InfoView2002 103
Observação
<xsd:element name="A" type=”ttt"/><xsd:complexType name=”ttt"> <xsd:sequence> <xsd:element name="B" …/> <xsd:element name="C" …/> </xsd:sequence></xsd:complexType>
é equivalente a
<xsd:element name="A"> <xsd:complexType> <xsd:sequence> <xsd:element name="B" …/> <xsd:element name="C" …/> </xsd:sequence> </xsd:complexType></xsd:element>
Elemento A referencia ocomplexType ttt.
Elemento A tem a definição complexType embutida na delcaração do elemento.
InfoView2002 104
Observação 2Uma declaração de elemento pode ter um atributo type, ou um complexType elemento filho, mas não pode ter ambos.
<xsd:element name="A" type=”ttt"> <xsd:complexType> … </xsd:complexType></xsd:element>
InfoView2002 105
Sumário de declaração de Elementos (2 formas)
<xsd:element name="nome" type="type" minOccurs="int" maxOccurs="int"/>
Um tipos simples (ex.., xsd:string)ou o nome deum complexType
<xsd:element name="nome" minOccurs="int" maxOccurs="int"> <xsd:complexType> … </xsd:complexType></xsd:element>
1
2
Um inteiro não negativo
Um inteiro nãonegativo ou "unbounded"
Obs: minOccurs e maxOccurs podem ser usadosapenas em declaração de elementos.
InfoView2002 106
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'
<xsd:simpleType name="ISBNType"> <xsd:restriction base="xsd:string"> <xsd:pattern value="\d{5}-\d{5}-\d{5}"/> <xsd:pattern value="\d{1}-\d{3}-\d{5}-\d{1}"/> <xsd:pattern value="\d{1}-\d{2}-\d{6}-\d{1}"/> </xsd:restriction></xsd:simpleType>
107
<?xml version="1.0"?><xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.publishing.org” xmlns="http://www.publishing.org”> <xsd:simpleType name="ISBNType"> <xsd:restriction base="xsd:string"> <xsd:pattern value="\d{5}-\d{5}-\d{5}"/> <xsd:pattern value="\d{1}-\d{3}-\d{5}-\d{1}"/> <xsd:pattern value="\d{1}-\d{2}-\d{6}-\d{1}"/> </xsd:restriction> </xsd:simpleType> <xsd:element name="CatalogoLivros"> <xsd:complexType> <xsd:sequence> <xsd:element name=”livro" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name=”titulo" type="xsd:string"/> <xsd:element name=”autor" type="xsd:string"/> <xsd:element name=”data" type="xsd:date"/> <xsd:element name="ISBN" type="ISBNType"/> <xsd:element name=”editora" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema>
InfoView2002 108
<xsd:complexType> ou <xsd: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)
InfoView2002 109
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)
InfoView2002 110
Exemplo de criação de um novo Datatype através da especificação de
valores de facetas
<xsd:simpleType name=”NumTelefone"> <xsd:restriction base="xsd:string"> <xsd:length value="8"/> <xsd:pattern value="\d{3}-\d{4}"/> </xsd:restriction></xsd:simpleType>
InfoView2002 111
Outro Exemplo
<xsd:simpleType name=”Cores-Brasil"> <xsd:restriction base="xsd:string"> <xsd:enumeration value=”verde"/> <xsd:enumeration value=”amarelo"/> <xsd:enumeration value=”azul"/> <xsd:enumeration value=”branco"/> </xsd:restriction></xsd:simpleType>
Cria um novo tipo chamado Cores-Brasil.Um elemento declarado deste tipo deve tero valor verde, amarelo, azul ou branco.
InfoView2002 112
Facetas do tipo Integer Facets:
pattern enumeration whitespace maxInclusive maxExclusive minInclusive minExclusive precision
InfoView2002 113
Exemplo<xsd:simpleType name= "EarthSurfaceElevation"> <xsd:restriction base="xsd:integer"> <xsd:minInclusive value="-1290"/> <xsd:maxInclusive value="29035"/> </xsd:restriction></xsd:simpleType><xsd:element name="elevation" type="EarthSurfaceElevation"/>
Exemplo. Definindo um elemento elevation: <elevation>5240</elevation>
InfoView2002 114
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.
InfoView2002 115
<?xml version="1.0"?><xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.publishing.org” xmlns="http://www.publishing.org”>
<xsd:complexType name="Publicacoes"> <xsd:sequence> <xsd:element name=”titulo" type="xsd:string" maxOccurs="unbounded"/> <xsd:element name=”autor" type="xsd:string" maxOccurs="unbounded"/> <xsd:element name=”data" type="xsd:date"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name=”livro"> <xsd:complexContent> <xsd:extension base=”Publicacoes" > <xsd:sequence> <xsd:element name="ISBN" type="xsd:string"/> <xsd:element name=”editora" type="xsd:string"/> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> <xsd:element name="CatalogoLivros"> <xsd:complexType> <xsd:sequence> <xsd:element name=”livro" type=”livro" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element></xsd:schema>
InfoView2002 116
Derivação por Restrição<xsd:complexType name="Publicacao"> <xsd:sequence> <xsd:element name=”titulo" type="xsd:string" maxOccurs="unbounded"/> <xsd:element name=”autor" type="xsd:string" maxOccurs="unbounded"/> <xsd:element name=”date" type="xsd:year"/> </xsd:sequence></xsd:complexType><xsd:complexType name= "PublicacaoUnicoAutor"> <xsd:complexContent> <xsd:restriction base="Publicacao"> <xsd:sequence> <xsd:element name=”titulo" type="xsd:string" maxOccurs="unbounded"/> <xsd:element name=”autor" type="xsd:string"/> <xsd:element name=”data" type="xsd:year"/> </xsd:sequence> </xsd:restriction> </xsd:complexContent></xsd:complexType>
InfoView2002 117
Proibindo Derivações <xsd:complexType name="Publicacao" final="#all" …>
Publicação não pode ser estendida or restringida
<xsd:complexType name="Publicacao" final="restriction" …> Publicacao não pode ser restringida
<xsd:complexType name="Publicação" final="extension" …> Publicação não pode ser estendida
InfoView2002 118
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)>
InfoView2002 119
<xsd:element name="CatalogoLivros"> <xsd:complexType> <xsd:sequence>
<xsd:element name=”livro" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name=”titulo" type="xsd:string"/> <xsd:element name=”autor" type="xsd:string" maxOccurs="unbounded"/> <xsd:element name=”data" type="xsd:string"/> <xsd:element name="ISBN" type="xsd:string"/> <xsd:element name=”editora" type="xsd:string"/> </xsd:sequence> <xsd:attributeGroup ref="AtributosLivro"/> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:attributeGroup name="AtributosLivro"> <xsd:attribute name="Categoria" use="required"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:enumeration value="autobiografia"/> <xsd:enumeration value="nao-ficcao"/> <xsd:enumeration value="ficcao"/> </xsd:restriction> </xsd:simpleType> </xsd:attribute> <xsd:attribute name=”EmEstoque" type="xsd:boolean" use="default" value="false"/> <xsd:attribute name="Revisor" type="xsd:string" use="default" value=" "/> </xsd:attributeGroup>
EmEstoque (true | false) "false"
Revisor CDATA " "
Categoria (autobiography | non-fiction | fiction) #REQUIRED
InfoView2002 120
<xsd:element name=”livro" maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> <xsd:element name=”titulo" type="xsd:string"/> <xsd:element name=”autor" type="xsd:string" maxOccurs="unbounded"/> <xsd:element name=”data" type="xsd:string"/> <xsd:element name="ISBN" type="xsd:string"/> <xsd:element name="editora" type="xsd:string"/> </xsd:sequence> <xsd:attribute name="Categoria" use="required"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:enumeration value="autobiografia"/> <xsd:enumeration value="nao-ficcao"/> <xsd:enumeration value="ficcao"/> </xsd:restriction> </xsd:simpleType> </xsd:attribute> <xsd:attribute name=”EmEstoque" type="xsd:boolean" use="default" value="false"/> <xsd:attribute name="Revisor" type="xsd:string" use="default" value=" "/> </xsd:complexType></xsd:element>
Alternativamente ...
121
Sumário de Declaração de Atributos (2 formas)
<xsd:attribute name="nome" type=”tipo-simples" use=”como-usado" value="valor"/>
requireddefaultfixedoptionalprohibited
This attribute is onlyused with use="default"and use="fixed"
xsd:stringxsd:integerxsd:boolean...
1
2 <xsd:attribute name="nome" use=”como-usad" value="valor"> <xsd:simpleType> <xsd:restriction base=”tipo-simples"> <xsd:facet value="valor"/> … </xsd:restriction> </xsd:simpleType></xsd:attribute>
InfoView2002 122
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).
<xsd:element name=”A"> <xsd:complexType> <xsd:sequence> … </xsd:sequence> <xsd:attribute name=”aa" …/> <xsd:attribute name=”ab" …/> </xsd:complexType></xsd:element>
”aa e ab sãoatributos de A"
InfoView2002 123
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?
InfoView2002 124
<xsd:element name="elevation"> <xsd:complexType> <xsd:simpleContent> <xsd:extension base="xsd:integer"> <xsd:attribute name="units" type="xsd:string" use="required"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType></xsd:element>
Solução
125
<xsd:simpleType name="elevationType"> <xsd:restriction base="xsd:integer">
<xsd:minInclusive value="0"/> <xsd:maxInclusive value="12000"/> </xsd:restriction></xsd:simpleType><xsd:simpleType name="unitsType"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="feet"/> <xsd:enumeration value="meters"/> </xsd:restriction></xsd:simpleType><xsd:element name="elevation"> <xsd:complexType> <xsd:simpleContent> <xsd:extension base="elevationType"> <xsd:attribute name="units" type="unitsType" use="required"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> </xsd:element>
Solução mais completa (constraints)
InfoView2002 126
Expressando Alternativas
<!ELEMENT transporte (trem | aviao | carro)>DTD:
XML Schema: <?xml version="1.0"?><xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.travel.org" xmlns="http://www.travel.org”> <xsd:element name="transporte"> <xsd:complexType> <xsd:choice> <xsd:element name="trem" type="xsd:string"/> <xsd:element name=”aviao" type="xsd:string"/> <xsd:element name=”carro" type="xsd:string"/> </xsd:choice> </xsd:complexType> </xsd:element></xsd:schema>
InfoView2002 127
Expressando Repetições
<?xml version="1.0"?><xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.binary.org" xmlns="http://www.binary.org”> <xsd:element name="binary-string"> <xsd:complexType> <xsd:choice minOccurs="0" maxOccurs="unbounded"> <xsd:element name="zero" type="xsd:unsignedByte" fixed="0"/> <xsd:element name="one" type="xsd:unsignedByte" fixed="1"/> </xsd:choice> </xsd:complexType> </xsd:element></xsd:schema>
<!ELEMENT binary-string (zero | one)*>DTD:
XML Schema:
InfoView2002 128
Expressando Ordem Qualquer
<?xml version="1.0"?><xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.publishing.org" xmlns="http://www.publishing.org”> <xsd:element name="CatalogoLivros"> <xsd:complexType> <xsd:sequence> <xsd:element name=”livro" maxOccurs="unbounded"> <xsd:complexType> <xsd:all> <xsd:element name=”titulo" type="xsd:string"/> <xsd:element name=”autor" type="xsd:string"/> <xsd:element name=”data" type="xsd:string"/> <xsd:element name="ISBN" type="xsd:string"/> <xsd:element name="editora" type="xsd:string"/> </xsd:all> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element>
XML Schema:
Problema: criar um elemento livro, que contenha autor, titulo, data, ISBN, e editora, em qualquer ordem.
InfoView2002 129
Elemento Vazio
<?xml version="1.0"?><xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" targetNamespace="http://www.photography.org" xmlns="http://www.photography.org”> <xsd:element name="galeria"> <xsd:complexType> <xsd:sequence> <xsd:element name="imagem" maxOccurs="unbounded"> <xsd:complexType> <xsd:attribute name="href" type="xsd:uriReference" use="required"/> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element></xsd:schema>
Schema:
<!ELEMENT imagem EMPTY><!ATTLIST imagem href CDATA #REQUIRED>DTD:
InfoView2002 130
XML API: DOM e SAX
Prof. Dr. Cláudio [email protected]
http://www.lsi.dsc.ufcg.edu.br
InfoView2002 131
DOM - Introdução
XML Document Object Model (DOM)W3C standard recommendationConstrói árvore na memória para documentos XML Um DOM Document é uma coleção de nodes organizada numa hierarquiaDOM provê uma API que permite o programador adicionar, editar, mover, ou remover nodes em qualquer ponto da árvoreDOM-based parsers fazem o “parsing” destas estruturas. Existe em várias linguagens (Java, C, C++, Python, Perl, etc.)
InfoView2002 132
DOM Roadmap
Um Parser analiza um arquivo XMLpara criar um DOM documentque é composto de nodesque podem ser elementos, atributos, textos,ou outros tipos de nodeque fazem parte de um (ou mais) Namespace(s)que podem ser acessados via métodosda DOM API
InfoView2002 133
Evolução do DOM
Level 0 - Foi a primeira recomendação que permitia Web browsers identificar e manipular elementos numa página
Level 1- inclui suporte a XML e HTML Level 2- permite o uso de Namespaces,
provê API mais sofisticada com eventos e CSS
Level 3- suporte avançado a Namespaces, eventos de User interface, DTD, XML Schema, Xpath, XSLT
InfoView2002 134
Exemplo<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE ORDERS SYSTEM "orders.dtd"><orders> <order> <customerid limit="1000">12341</customerid> <status>pending</status> <item instock="Y" itemid="SA15"> <name>Silver Show Saddle, 16 inch</name> <price>825.00</price> <qty>1</qty> </item> <item instock="N" itemid="C49"> <name>Premium Cinch</name> <price>49.00</price> <qty>1</qty> </item> </order> <order> <customerid limit="150">251222</customerid> <status>pending</status> <item instock="Y" itemid="WB78"> <name>Winter Blanket (78 inch)</name> <price>20</price> <qty>10</qty> </item> </order></orders>
InfoView2002 135
Exemplo (cont)
InfoView2002 136
Tipos básicos de nodes Document Element Attribute Text
InfoView2002 137
DOM Introdução
DOM treeCada node representa um elemento, atributo, etc.
<?xml version = "1.0"?><message from = ”Ana" to = ”Marta"> <body>Oi Marta!</body></message>
Node criado para elemento messageElemento message tem element child node: elemento body Elemento body tem text child node: “Oi Marta!"Atributos from e to também têm nodes na árvore
InfoView2002 138
Implementações de DOM
DOM-based parsersMicrosoft msxmlSun Microsystem JAXP
Parser Descrição
JAXP Sun Microsystem Java API para XMLParsing (JAXP) é livremente disponívelem java.sun.com/xml.
XML4J IBM XML Parser for Java (XML4J) élivremente disponível emwww.alphaworks.ibm.com/tech/xml4j.
Xerces Apache Xerces Java Parser é livrementedisponível em xml.apache.org/xerces.
msxml Microsoft XML parser (msxml) version2.0 é embutido no Internet Explorer5.5. Version 3.0 está livrementedisponível em msdn.microsoft.com/xml.
4DOM 4DOM é um parser para linguagem Python,disponível livremente emfourthought.com/4Suite/4DOM.
XML::DOM XML::DOM é um módulo Perl que permitemanipular documentos XML usando Perl.Visitewww-4.ibm.com/software/developer/library/xml-perl2.
InfoView2002 139
DOM: classes e interfaces.
Class/Interface Descrição
Document interface Representa o top-level node do documento XML, que provê acesso atodos os demais nodes—incluindo o elemento root.
Node interface Representa um XML document node.NodeList interface Representa uma lista de Node objects.Element interface Representa um elemento node. Deriva de Node.Attr interface Representa um atributo node. Deriva de Node.CharacterDatainterface
Representa character data. Deriva de Node.
Text interface Representa um text node. Deriva de CharacterData.
Comment interface Representa um node comentário. Deriva de CharacterData.
ProcessingInstructioninterface
Representa um processing instruction node. Deriva de Node.
CDATASection interface Representa um CDATA section. Deriva de Text.
InfoView2002 140
Alguns métodos de Document
Método Descrição
createElement Cria um element node.createAttribute Crira um attribute node.createTextNode Cria um text node.createComment Cria um comment node.createProcessingInstruction Cria um processing instruction node.createCDATASection Cria um CDATA section node.getDocumentElement Retorna to elemento rootappendChild Concatena um child node.getChildNodes Retorna os child nodes.
InfoView2002 141
Métodos Node
Método Descrição
appendChild Concatena um child node.cloneNode Duplica o node.getAttributes Retorna os atributos do nodegetChildNodes Retorna os nodes filhos do node.getNodeName Retorna o nome do nodegetNodeType Retorna o tipo do node (ex.. elemento, atributo, text,
etc.).getNodeValue Retorna o valor do node.getParentNode Retorna o pai do nodehasChildNodes Retorna true se o node tem nodes filhosremoveChild Remova um node filho do node.replaceChild Troca um node filho com outro node.setNodeValue Coloca o valor do nodeinsertBefore Concatena um node filho na frente de um node filho..
InfoView2002 142
Alguns tipos de node
Tipo de Node DescriçãoNode.ELEMENT_NODE Representa um element node.Node.ATTRIBUTE_NODE Representa um attribute node.Node.TEXT_NODE Representa um text node.Node.COMMENT_NODE Representa um comment node.Node.PROCESSING_INSTRUCTION_NODE
Representa um processing instructionnode.
Node.CDATA_SECTION_NODE Representa um CDATA section node.
InfoView2002 143
Métodos de Element
Método Descrição
getAttribute Retorna um valor de atributo.getTagName Retorna um nome de elementoremoveAttribute Remove um atributo de um elementosetAttribute Coloca um valor de atributo
InfoView2002 144
Parsing um arquivo XML num documento Processo em 3 passos
1. Criar o DocumentBuilderFactory. Este objeto criará o DocumentBuilder.
2. Criar o DocumentBuilder. O DocumentBuilder fará o atual parsing criar o objeto Document.
3. Fazer o parsing do arquivo para criar o objeto Document.
InfoView2002 145
Exemplo de aplicação básica
import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import java.io.File;import org.w3c.dom.Document;
public class OrderProcessor { public static void main (String args[]) { File docFile = new File("orders.xml"); Document doc = null; try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); doc = db.parse(docFile); } catch (Exception e) { System.out.print("Problem parsing the file."); } }}
InfoView2002 146
Ex de aplicação básicaimport javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import java.io.File;import org.w3c.dom.Document;import org.w3c.dom.Element;public class OrderProcessor {
...System.exit(1);
}//Passo 1: obtém o elemento raiz (root) Element root = doc.getDocumentElement();System.out.println("The root element is " + root.getNodeName());}
}
InfoView2002 147
Ex de aplicação básica - Obtendo um node filho
...import org.w3c.dom.NodeList;... //PASSO 1: obtém o elemento raiz(root) Element root = doc.getDocumentElement(); System.out.println("The root element is "+root.getNodeName()); //PASSO 2: obtém os filhos (children) NodeList children = root.getChildNodes(); System.out.println("There are "+children.getLength()+" nodes in this document."); }}
InfoView2002 148
Usando getFirstChild() e getNextSibling()
...import org.w3c.dom.Node;...//PASSO 3: processando os filhos (children)for (Node child = root.getFirstChild(); child != null; child = child.getNextSibling()) { System.out.println(child.getNodeName()+" = "+child.getNodeValue()); }}}...
InfoView2002 149
Múltiplos filhos
...public class OrderProcessor { private static void stepThrough (Node start) { System.out.println(start.getNodeName()+" = "+start.getNodeValue()); for (Node child = start.getFirstChild(); child != null;child = child.getNextSibling()) { stepThrough(child); } } public static void main (String args[]) { File docFile = new File("orders.xml"); ... System.out.println("There are "+children.getLength() +" nodes in this document."); //PASSO 4: fazendo recursividade stepThrough(root); }}
InfoView2002 150
Resultado:
InfoView2002 151
Manipulando Atributos
...import org.w3c.dom.NamedNodeMap;...private static void stepThroughAll (Node start){ System.out.println(start.getNodeName()+" = "+start.getNodeValue()); if (start.getNodeType() == start.ELEMENT_NODE) { NamedNodeMap startAttr = start.getAttributes(); for (int i = 0; i < startAttr.getLength(); i++) { Node attr = startAttr.item(i); System.out.println(" Attribute: "+ attr.getNodeName() +" = "+attr.getNodeValue()); } } for (Node child = start.getFirstChild(); child != null; child = child.getNextSibling()) { stepThroughAll(child); }}
InfoView2002 152
Manipulando Atributos
InfoView2002 153
Edição de documentos XML Existem métodos para
adicionar nodes, remover nodes, mudar valores de nodes
Consulte a API!
InfoView2002 154
SAX
SAXSimple API for XMLOutro método para acessar o conteúdo de documentos XML.Desenvolvido por membros da XML-DEV mailing-list (não é da W3C)Usa um modelo baseado em eventos
Notificações (eventos) ocorrem à medida em que o documento é analizado (“parsed”)
InfoView2002 155
SAX-based Parsers
SAX-based parsersDisponível em várias LPs:
e.g., Java, Python, C++, etc.
Produto Descrição
JAXP Sun JAXP é disponível em java.sun.com/xml.JAXP suporta SAX e DOM.
Xerces Apache Xerces parser é disponível emwww.apache.org. Xerces suporta SAX e DOM.
MSXML 3.0 Microsoft msxml parser disponível emmsdn.microsoft.com/xml e suporta SAX eDOM.
InfoView2002 156
Eventos
SAX parserInvoca certos métodos quando eventos ocorrem
Programadores devem fazer overriding destes métodos para processar os dados
InfoView2002 157
Métodos invocados pelo SAX parser
Método Descrição
setDocumentLocator Invocado no início do parsing.startDocument Invocado quando o parser encontra o início
de um documento XMLendDocument Invocado quando o parser encontra o fim de
um documento XMLstartElement Invocado quando a tag de inicio de um elemento é encontradaendElement Invocado quando a tag de fim de um elemento é encontrada.characters Invocado quando text characters são encontrados.ignorableWhitespace Invocado quando whitespace que pode ser ignorado é
encontrado.processingInstruction Invocado quando um PI é encontrada.
InfoView2002 158
Como SAX funciona?Dado o documento XML abaixo:
<?xml version="1.0"?><samples><server>UNIX</server><monitor>color</monitor></samples>
SAX gera os seguintes EVENTOS:Start documentStart element (samples)Characters (white space)Start element (server)Characters (UNIX)End element (server)Characters (white space)Start element (monitor)Characters (color)End element (monitor)Characters (white space)End element (samples)
InfoView2002 159
Como SAX funciona?Processamento em SAX involve os seguintes passos
1. Criar um event handler2. Criar o SAX parser3. Associar o event handler ao parser criado4. Fazer o parsing do documento, enviando cada evento aoevent handler.
InfoView2002 160
Exemplo: Uma pesquisa de opinião
<?xml version="1.0"?><surveys><response username="bob"><question subject="appearance">A</question><question subject="communication">B</question><question subject="ship">A</question><question subject="inside">D</question><question subject="implant">B</question></response><response username="sue"><question subject="appearance">C</question><question subject="communication">A</question><question subject="ship">A</question><question subject="inside">D</question><question subject="implant">A</question></response><response username="carol"><question subject="appearance">A</question><question subject="communication">C</question><question subject="ship">A</question><question subject="inside">D</question><question subject="implant">C</question></response></surveys>
InfoView2002 161
Criando um event handler
import org.xml.sax.helpers.DefaultHandler;public class SurveyReader extends DefaultHandler{
public SurveyReader() {System.out.println("Object Created.");
}public void showEvent(String name) {
System.out.println("Hello, "+name+"!");}public static void main (String args[]) { SurveyReader reader = new SurveyReader(); reader.showEvent(”Nick");}
}
InfoView2002 162
Criando o SAX parser
// Exemplo usando JAXPimport org.xml.sax.helpers.DefaultHandler;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.XMLReader;
public class SurveyReader extends DefaultHandler{
public SurveyReader() {}public static void main (String args[]) { XMLReader xmlReader = null; try { SAXParserFactory spfactory =
SAXParserFactory.newInstance(); SAXParser saxParser = spfactory.newSAXParser();
xmlReader = saxParser.getXMLReader();
} catch (Exception e) { System.err.println(e); System.exit(1); }}
}
InfoView2002 163
Associando o event handler ao parser
...xmlReader = saxParser.getXMLReader();xmlReader.setContentHandler(new SurveyReader());} catch (Exception e) {...
InfoView2002 164
Parsing os dados...import org.xml.sax.InputSource;...xmlReader = saxParser.getXMLReader();xmlReader.setContentHandler(new SurveyReader());InputSource source = new InputSource("surveys.xml");xmlReader.parse(source);} catch (Exception e) {...
Pronto! Falta apenas definir os eventos ...
InfoView2002 165
Criando um ErrorHandler...import org.xml.sax.SAXParseException;public class SurveyReaderextends DefaultHandler{ public SurveyReader() { } public void error (SAXParseException e) { System.out.println("Error parsing the file: "+e.getMessage()); } public void warning (SAXParseException e) { System.out.println("Problem parsing the file: "+e.getMessage()); } public void fatalError (SAXParseException e) { System.out.println("Error parsing the file: "+e.getMessage()); System.out.println("Cannot continue."); System.exit(1); }public static void main (String args[]) { ...
InfoView2002 166
Associando o ErrorHandler
...xmlReader.setContentHandler(new SurveyReader());xmlReader.setErrorHandler(new SurveyReader());InputSource source = new InputSource("surveys.xml");...
InfoView2002 167
Eventos: startDocument()...import org.xml.sax.SAXException;public class SurveyReaderextends DefaultHandler{...public void fatalError (SAXParseException e) {System.out.println("Error parsing " +"the file: "+e.getMessage());System.out.println("Cannot continue.");System.exit(1);}public void startDocument() throws SAXException { System.out.println("Tallying survey results...");}public static void main (String args[]) {...
InfoView2002 168
Eventos: startElement()...import org.xml.sax.Attributes;public class SurveyReader extends DefaultHandler{ ... public void startDocument() throws SAXException { System.out.println("Tallying survey results..."); } public void startElement( String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { System.out.print("Start element: "); System.out.println(localName); } public static void main (String args[]) { …}
InfoView2002 169
startElement(): pegando atributos
...public void startElement(
String namespaceURI,String localName,String qName,Attributes atts)throws SAXException {
System.out.print("Start element: "); System.out.println(localName); for (int att = 0; att < atts.getLength(); att++) { String attName = atts.getLocalName(att); System.out.println(" " + attName + ": " + atts.getValue(attName)); }}...
InfoView2002 170
Obtendo Dados: characters()
…// ch inclui o documento inteiropublic void characters(char[] ch,
int start,int length)throws SAXException {
if (thisElement == "question") {printIndent(4);System.out.print(thisQuestion + ": ");System.out.println(new String(ch, start, length));
}}...
InfoView2002 171
Obtendo Dados: characters()
InfoView2002 172
Obtendo Dados: characters() (completo)
...public void printIndent(int indentSize) { for (int s = 0; s < indentSize; s++) { System.out.print(" ");}} String thisQuestion = ""; String thisElement = ""; public void startElement( String namespaceURI,
String localName,String qName,Attributes atts)throws SAXException {
if (localName == "response") { System.out.println("User: " + atts.getValue("username")); } else if (localName == "question") { thisQuestion = atts.getValue("subject"); } thisElement = localName; }
public void endElement( String namespaceURI,
String localName,String qName)throws SAXException {
thisQuestion = ""; thisElement = "";}public void characters(char[] ch,
int start,int length)throws SAXException {
if (thisElement == "question") { printIndent(4); System.out.print(thisQuestion + ": "); System.out.println(new String(ch, start, length)); }}...
InfoView2002 173
SAX versus DOM
DOMModelo baseado em árvorearmazena o documento inteiro numa hierarquia de document nodesDados são acessados rapidamenteProvê facilidades para adicionar e remover nodes
SAXInvoca métodos quando markup (tag) é encontradaMelhor performance do que DOMMenos overhead de memória do que DOMTipicamente usado para ler documentos (não para modificá-los)
InfoView2002 174
XSL - eXtensible Stylesheet Language
InfoView2002 175
XSL - Motivação Vantagens de separar apresentação de
conteúdo: Múltiplos formatos de saída: tamanhos
diferentes, mídias diferentes (papel, online), dispositivos diferentes (PDA, celular, PC)
Interface voltada para usuário (ex.: acessabilidade), cores, fontes, etc.
Uso de estilos padrões Liberdade do autor não se preocupar com
apresentação, que será tratada depois por um profissional.
InfoView2002 176
Opções para mostrar XML
InfoView2002 177
O que faz uma folha de estilo? Especifica a apresentação de XML
em duas categorias: Uma transformação opcional do
documento de entrada em outra estrutura
Uma descrição de como apresentar a informação transformada
InfoView2002 178
O que faz um folha de estilo? geração de texto supressão de conteúdo mover texto duplicar texto ordenação transformações mais complexas
que computam nova informação baseada na informação existente.
InfoView2002 179
Revisão de CSS CSS - Cascade Style Sheet Define o estilo de um documento
para apresentação Pode ser inline ou externa ao
documento Precedência de estilos:
Autor > Usuário > Web Browser
InfoView2002 180
External Style Sheets
External Style SheetsContidas num arquivo.css Único style sheet usado por múltiplas páginasUsado com o elemento link
InfoView2002 181
Exemplo de um CSS
/* styles.css *//* An external stylesheet */a { text-decoration: underline; color: red; background-color: #ccffcc }
li em { color: red; font-weight: bold}
ul { margin-left: 2cm }
<html><!-- Linking external style sheets --><head><title>Exemplo de CSS</title><link rel = "stylesheet" type = "text/css”
href = "styles.css"></head>
InfoView2002 182
XSL - Princípios gerais
Como CSS, funcionamento a base de regras
CSS não modifica a estrutura de um documento, XSL sim
XSL utiliza a sintaxe XML
InfoView2002 183
XSL - Histórico
XML derivada de SGMLPadronizada pelo W3CXSL derivada de DSSSL (Document Style Semantics and Specification Language)Primeira proposta formal em 1997 pela W3C (já continha conceitos de XSLT, como uso de templates)Novembro de 1999 XSLT tornou-se uma recomendação da W3CÚltima versão de XSL: Outubro de 2001 (incluindo XSL-FO)
InfoView2002 184
Componentes de XSL
XSL consiste logicamente de 3 componentes:
XPath: XML Path Language-- linguagem para referenciar partes específicas de um documento XML
XSLT: XSL Transformations-- linguagem para descrever como transformar um documento XML (representado como uma árvore) em outro
XSL-FO: uma descrição de um conjunto de Formatting Objects e Formatting Properties
InfoView2002 185
XSLT - Características
Linguagem declarativaDescreve a transformação desejada, ao invés de prover uma sequência de instruções procedurais
XSLT é essencialmente uma “ferramenta” para transformar documentos XML
XSLT manipula árvores
Uso de XSL Namespaces - O W3C provê um namespace para tags XSL
InfoView2002 186
XSLT - Características
Processadores XSLT
Aplicam um stylesheet XSLT a um documento origem XML e produz um documento resultado.
Tratam árvores
Exemplos de processadores: Saxon, xt, MSXML3, Xalan (Apache)Web browsers já trazem tal processador sobretudo IE 6.0 e Netscape 6.0
InfoView2002 187
XSLT - Estrutura de uma folha XSL
Uma folha XSL é um conjunto de regras
Uma regra associa um seletor a uma forma ou modelo
O seletor define a estrutura a qual pode se aplicar esta regra
A forma define a estrutura da sub-árvore gerada quando da ativação da regra
Se várias regras se aplicam a um elemento, a mais específica é executada
188
XSLT - CaracterísticasElemento raiz de um documento XSL é <xsl:stylesheet> ou <xsl:transform>
<xsl:stylesheet version=“1.0” xmlns:xsl=http://www.w3.org/1999/XSL/Transform>
<?xml version=“1.0” encoding=ISO-8859-1”?><xsl:stylesheet version=“1.0” xmlns:xsl=http://www.w3.org/1999/XSL/Transform>
<xsl:template match=“”>corpo do template
</xsl:template>…
<xsl:template match=“”>corpo do template
</xsl:template></xsl:stylesheet>
Documento XSL: Cabeçalho XML + <xsl:stylesheet> ou <xsl:transform> + Conjunto de regras de template
InfoView2002 189
XSLT - Características
O corpo das regras de template é constituído por:Expressões XPathElementos XSLTFunções XSLT e XPath
Permite manipular partes de um documento
Duas formas de utilizar um arquivo xsl:Através de uma linha de comando, que referencia os documentos envolvidos na transformação (p.e, o xml origem, o html resultado e o xslt)Incluindo uma referência no próprio arquivo xml
InfoView2002 190
<?xml version=“1.0” encoding=“iso-8859-1”?><saudacao>Bem-vindo ao InfoView 2002!</saudacao>
Saudacao.xml
<html><head>
<title>Saudação de Hoje</title></head><body>
<p>Bem-vindo ao InfoView 2002!</p></body></html>
Saudacao.html
InfoView2002 191
<?xml version=“1.0” encoding=“iso-8859-1”?><xsl:stylesheet version=“1.0” xmlns:xsl=“http://www.w3.org/1999/XSL/Transform”><xsl:template match=“/”>
<html><head>
<title>Saudação de Hoje</title></head><body>
<p><xsl:value-of select=“saudacao”/></p></body></html>
</xsl:template></xsl:stylesheet>
Saudacao.xsl
Linha de comando para transformar Saudacao.xml em Saudacao.html via Saudacao.xsl:C:>saxon Saudacao.xml Saudacao.xsl > Saudacao.html
InfoView2002 192
<?xml version=“1.0” encoding=“iso-8859-1”?><?xml-stylesheet type=“text/xsl” href=“saudacao.xsl”?><saudacao>Bem-vindo ao InfoView 2002!</saudacao>
Saudacao.xml
Inclusão de uma referência ao arquivo xsl no próprio arquivo xml:
InfoView2002 193
Exemplo 2
Stylesheet que transforma elementos <para> e <emphasis>
para HTML:<?xml version='1.0'?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="para"> <p><xsl:apply-templates/></p></xsl:template>
<xsl:template match="emphasis"> <i><xsl:apply-templates/></i></xsl:template>
</xsl:stylesheet>
InfoView2002 194
Exemplo 2(cont)
Com a stylesheet anterior, o documento XML:<?xml version='1.0'?><para>Isto é um <emphasis>teste</emphasis>.</para>
seria transformado em:<?xml version="1.0" encoding="utf-8"?><p>Isto é um <i>teste</i>.</p>
InfoView2002 195
Exemplo 3:<capitulo titulo = introducao>
Texto do capitulo
</capitulo>
<xsl:template match=“capitulo”>
<H1> <xsl:value-of select=“./@titulo”> </H1>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match=“text()”>
<xsl:value-of select=“.”/>
</xsl:template>
<H1> Introducao </H1>
Texto do capitulo
XML
XSL
HTML
InfoView2002 196
Templates
A maioria dos templates têm a seguinte forma:<xsl:template match="emphasis">
<i><xsl:apply-templates/></i></xsl:template>
The elemento <xsl:template> é um template
O match pattern determina onde este template se aplica
Elementos XSLT vêm do XSL namespace
InfoView2002 197
XSLT – Expressões XPath
Contrutores sintáticosChamadas de função - pode-se chamar funções embutidas ou definidas em XSLT
concat()calculaDesconto()count(@*)not(isbn)
$ - referencia uma variável ou um parâmetro$X$ALPHA
or, and - representa expressões booleanas or e and, respectivamente$x = 5 or $x = 10 $x > 3 and $x < 8
InfoView2002 198
Xpath - Exemplo de patterns (1)
para associa todos filhos <para> no contexto corrente
para/emphasis associa com todos elementos <emphasis> que têm um pai <para>
/ associa com a raiz do documento
para//emphasis associa com todos elementos <emphasis> que têm um ancestral <para>
section/para[1] associa o primeiro filho <para> de todos os filhos <section> no contexto corrente
//title associa todos elementos <title> em qualquer lugar no documento
.//title associa todos elementos <title> que são descendentes do contexto corrente
InfoView2002 199
XPath- Exemplo de patterns (2)
section/*/note associa elementos <note> que tenham <section> como avós.
stockquote[@symbol] associa elementos <stockquote> que têm um atributo "symbol"
stockquote[@symbol="XXXX"] associa elementos <stockquote> que têm um atributo "symbol" com valor "XXXX"
emphasis|strong associa elementos <emphasis> ou <strong>
InfoView2002 200
XSLT - Elementos
Elementos XSLT possuem sintaxe e semântica bem definidos
Existem muitos elementos pré-definidos no namespace XSLT e que são interpretados por processadores XSLT
Nem todos os elementos XSLT estão disponíveis para todos os processadores XSLT
Forma:<xsl: element_name>
InfoView2002 201
XSLT - Elementos
<?xml version="1.0" encoding="ISO-8859-1" ?> -<catalog>
<cd><title>Empire Burlesque</title><artist>Bob Dylan</artist>
<country>USA</country><company>Columbia</company><price>10.90</price>
<year>1985</year> </cd><cd>
<title>Hide your heart</title><artist>Bonnie Tyler</artist><country>UK</country><company>CBS Records</company><price>9.90</price><year>1988</year>
</cd>...
</catalog>
Exemplo Base de XML:
InfoView2002 202
XSLT - Elementos
<xsl:template>Contém regras que serão aplicadas a um nó específicoPossui o atributo “match”, que determina à qual elemento XML, a regra deve ser aplicada.
<xsl:value-of>É usado para selecionar o valor de um elemento XML e adicioná-lo à saída da transformaçãoPossui o atributo “select”, que contém uma expressão Xpath que calcula o valor a ser adicionado ao documento resultado
InfoView2002 203
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xsl:stylesheet version="1.0” xmlns:xsl="http://www.w3.org/1999/XSL/Transform”>
<xsl:template match="/">
<html> <body>
-<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
</tr>
<tr>
<td> <xsl:value-of select="catalog/cd/title" /> </td>- <td> <xsl:value-of select="catalog/cd/artist"/> </td>
</tr>
</table>
</body> </html> </xsl:template> </xsl:stylesheet>
InfoView2002 204
Resultado
InfoView2002 205
XSLT - Elementos
<xsl:for-each>Permite a construção de loopsPossui o atributo “select”, que contém uma expressão Xpath que vai determinar sobre que elemento será realizado o loop
<xsl:sort>É usado para ordenar a saídaPossui o atributo “select”, que indica qual elemento XML ordenarPossui o atributo “order”, que indica o tipo da ordenação: ascending ou descending.
InfoView2002 206
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">-
<xsl:template match="/">
<html><body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
</tr>
<xsl:for-each select="catalog/cd">
<xsl:sort select="artist" />
<tr>
<td> <xsl:value-of select="title" /> </td>
<td> <xsl:value-of select="artist" /> </td>
</tr>
</xsl:for-each>
</table>
</body> </html>
</xsl:template> </xsl:stylesheet>
InfoView2002 207
Resultado
InfoView2002 208
XSLT - Elementos
<xsl:if>Aplica um conteúdo apenas se uma condição especificada for verdadeiraPossui o atributo “test”, que contém a expressão a ser avaliada
<xsl:if test=“price>‘10’>conteúdo ...
</xsl:if>
InfoView2002 209
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html><body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Artist</th>
</tr>
<xsl:for-each select="catalog/cd">
<xsl:if test="price>'10'">
<tr>
<td> <xsl:value-of select="title" /> </td>
<td> <xsl:value-of select="artist" /> </td>
</tr>
</xsl:if>
</xsl:for-each>
</table>
</body> </html> </xsl:template> </xsl:stylesheet>
InfoView2002 210
XSLT - Elementos
InfoView2002 211
XSLT - Elementos<xsl:attribute>
É usado para adicionar atributos aos elementos
<picture><xsl:attribute name=“source”/>
<picture>
<xsl:template match="/"> <xsl:for-each select="catalog/cd">
<xsl:element name="singer"><xsl:value-of
select="artist" /> </xsl:element><br />
</xsl:for-each></xsl:template>
<xsl:element> cria um elemento (node) na saída
InfoView2002 212
XSLT - Elementos
<xsl:copy>Cria uma cópia do nó corrente do documento origem para o documento destino
<xsl:template match="message"> <xsl:copy></xsl:copy>
</xsl:template>
<xsl:copy-of>–Cria uma cópia do nó corrente (inclusive os nós filhos e atributos)
InfoView2002 213
<?xml version = "1.0"?><!-- Banco de Dados Esporte --><esportes> <jogo titulo = "cricket">
<id>243</id> <para> Mais popular na Inglaterra </para>
</jogo> <jogo titulo = ”baseball">
<id>431</id> <para> Mais popular nos EUA </para>
</jogo> <jogo titulo = ”futebol">
<id>123</id> <para> Mais popular no Brasil </para>
</jogo></esportes>
Exemplo: Seja o DB XML:
InfoView2002 214
match elemento esportes e aplica os templates aos nodes
filhos esportes
<?xml version = "1.0"?><!-- Usando xsl:element e xsl:attribute --><xsl:stylesheet version = "1.0” xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"> <xsl:template match = "/"> <xsl:apply-templates/> </xsl:template>
<xsl:template match = ”esportes"> <esportes> <xsl:apply-templates/> </esportes> </xsl:template> <xsl:template match = ”jogo"> <xsl:element name = "{@titulo}"> <xsl:attribute name = "id">
<xsl:value-of select = "id"/> </xsl:attribute> <comment>
<xsl:value-of select = "para"/> </comment>
</xsl:element> </xsl:template></xsl:stylesheet>
Use o atributo match para selecionar a raiz do documento XML
Cria elemento titulo
Cria atributo id para elemento titulo
Cria comentário com o conteúdo do elemento
para
Exemplo (cont): XSL
InfoView2002 215
<?xml version = "1.0" ?><esportes> <cricket id = "243">
<comment> Mais popular na Inglaterra</comment>
</cricket> <baseball id = "432">
<comment> Mais popular nos EUA</comment>
</baseball> <futebol id = ”123">
<comment> Mais popular no Brasil</comment>
</futebol></esportes>
Resultado produzido
InfoView2002 216
XSLT - Elementos
<xsl:param> Elemento que define parâmetros Possui o atributo “name” para assinalar o nome do
parâmetro Possui o atributo “select”, que armazena o valor do
parâmetro
<xsl:call-template> Elemento que chama um determinado template Possui o atributo “name” para assinalar o nome do
template
InfoView2002 217
<xsl:with-param> Elemento que define os valores dos parâmetros quando da
chamada de um template Possui o atributo “name” para assinalar o nome do
parâmetro Possui o atributo “select”, que armazena o valor do
parâmetro
<xsl:variable> Elemento usado para declarar variáveis Possui o atributo “name” para assinalar o nome da variável Possui o atributo “select”, que armazena o valor do variável
XSLT - Elementos
InfoView2002 218
XSLT - Elementos
<xsl:template name=“parenthsize”><xsl:param name=“string”/><xsl:value-of select=“concat(‘(‘,$string,’)’)”/>
</xsl:template>
<xsl:variable name=“credit-in-paren”><xsl:call-template name=“parenthsize”>
<xsl:with-param name=“string” select=“@credit”/></xsl:call-template>
<xsl:variable>
InfoView2002 219
XSLT - Elementos
<xsl:text> Elemento usado para escrever texto na saída
<xsl:template match="car"> <p> <xsl:value-of
select="@year"/> <xsl:text>.</xsl:text> <xsl:value-of
select="@color"/> </p> </xsl:template>
InfoView2002 220
XSLT - Funções
Juntamente com XPath e os elementos XSLT, formam o core XSLT
Em um stylesheet XSLT podem ser usadas dois tipos de funções built-in:
Funções XPath Funções XSLT
Existem ainda as funções que podem ser definidas pelo elemento XSLT <xsl:functions>
<xsl:value-of select=“funcs:f1”><xsl:functions ns=“funcs” type=“text/javascript”>
function f1() { return “Funcao 1”; }
</xsl:functions>
InfoView2002 221
XSLT - Funções
format-number() É usada para converter números em strings de
acordo com algum padrão de formato format-number(value, format) => string<<format-number(12.5, ‘$#.00’)>> <<$12.50>><<format-number(0.25, ‘#00%’)>> <<25%>>
generate-id() Gera um string, na forma de um nome XML, que
unicamente identifica um nó. generate-id(nó) => string o código retornado depende do XSLT processor<<generate-id(book)>> <<N015732>>
InfoView2002 222
XSLT - Funções
current() Retorna o nó corrente current() => conjunto de nós<<generate-id(current())>>
document() Retorna o nó raiz de um documento XML externo document(uri) => nó
<<document(‘data.xml’)>>
InfoView2002 223
XSLT - Funções
id() Retorna o nó com um determinado valor para seu
atributo ID id(value) => nó<<id(‘A321-780’)>> <product code=“A321-780”>
element-available() É usada para testar se um determinada instrução
XSLT está disponível para uso. Element-available(name) => boolean<<element-available(‘xsl:text’)>>
InfoView2002 224
XSLT - Funções
count(arg1) retorna o número de nodes presentes no conjunto de
nós passados como argumento sum(arg1)
calcula a soma de um conjunto de valores numéricos contidos nos nodes do conjunto de nodes passados como argumento
contains(arg1, arg2) testa se arg1 contém arg2 como substring é case sensitive
Ex: contains (‘Paris’, ‘A’) retorna false
InfoView2002 225
XSLT - Exemplo Completo (Doc1 – Documento Origem XML)<?xml version="1.0" encoding="utf-8" ?>
<customers> <customer CustomerID="ALFKI" CompanyName="Alfreds Futterkiste"
ContactName="Maria Anders" ContactTitle="Sales Representative" Address="Obere Str. 57" City="Berlin" PostalCode="12209" Country="Germany" Phone="030-0074321" Fax="030-0076545" />
<customer CustomerID="ANATR" CompanyName="Ana Trujillo Emparedados y helados" ContactName="Ana Trujillo" ContactTitle="Owner" Address="Avda. de la Constitución 2222" City="México D.F." PostalCode="05021" Country="Mexico" Phone="(5) 555-4729" Fax="(5) 555-3745" />
<customer CustomerID="AROUT" CompanyName="Around the Horn" ContactName="Thomas Hardy" ContactTitle="Sales Representative" Address="120 Hanover Sq." City="London" PostalCode="WA1 1DP" Country="UK" Phone="(171) 555-7788" Fax="(171) 555-6750" />
<customer CustomerID="BERGS" CompanyName="Berglunds snabbköp" ContactName="Christina Berglund" ContactTitle="Order Administrator" Address="Berguvsvägen 8" City="Luleå" PostalCode="S-958 22" Country="Sweden" Phone="0921-12 34 65" Fax="0921-12 34 67" />...
</customers>
InfoView2002 226
<?xml version="1.0" encoding="UTF-16" ?>
<customers><customer CompanyName="Cactus Comidas para llevar" CustomerID="CACTU" Country="Argentina" />
<customer CompanyName="Océano Atlántico Ltda." CustomerID="OCEAN" Country="Argentina" />
<customer CompanyName="Ernst Handel" CustomerID="ERNSH" Country="Austria" /> <customer CompanyName="Piccolo und mehr" CustomerID="PICCO"
Country="Austria" /> <customer CompanyName="Maison Dewey" CustomerID="MAISD"
Country="Belgium" /> <customer CompanyName="Comércio Mineiro" CustomerID="COMMI"
Country="Brazil" />
...<customer CompanyName="Save-a-lot Markets" CustomerID="SAVEA" Country="USA" /> <customer CompanyName="The Big Cheese" CustomerID="THEBI" Country="USA" />
</customers>
XSLT - Exemplo Completo (Doc1 – Documento Resultado XML)
InfoView2002 227
<?xml version="1.0" encoding="utf-8" ?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match=“customer">
<xsl:apply-templates /> </xsl:template> <xsl:template match="customers"> <xsl:for-each select="customer"> <xsl:sort select="@Country" order="ascending" />
<customer> <xsl:attribute name="CompanyName"> <xsl:value-of select="@CompanyName" /> </xsl:attribute>
<xsl:attribute name="CustomerID"> <xsl:value-of select="@CustomerID" />
</xsl:attribute><xsl:attribute name="Country">
<xsl:value-of select="@Country"/></xsl:attribute>
</customer> </xsl:for-each></xsl:template> </xsl:stylesheet>
XSLT - Exemplo Completo (Documento XSLT para conversão Doc1 => Doc2)
InfoView2002 228
XSL: Extensible Stylesheet Language Formatting Objects
Formatting objects Usado para formatar documentos XML
para apresentação Tipicamente usado quando o resultado da
transformção é para mídia impressa livros, revistas, encartes, etc.
FOP Ferramenta em Java da Apache Transforma documentos XSL que contêm
formatting objects Download em xml.apache.org/fop
InfoView2002 229
XSLFO Exemplos de ferramentas
http://xml.apache.org/fop - FOP para PDF
http://www.unicorn-enterprises.com/ - TeX para PDF
http://www.jfor.org/ - XSLFO para RTF http://www.xsmiles.org/ - browser XML
que usa FOP
InfoView2002 230
<?xml version="1.0" encoding="utf-8"?><fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">...<fo:page-sequence> <fo:flow> <fo:block font-size="18pt" font-weight="bold" text-align="centered"> Prefácio </fo:block> <fo:block font-size="12pt" space-before="1pc" text-align="justified"> Este é um documento simples de teste. Ele mostra uma <fo:inline font-style="italic">árvore</fo:inline> fo-result parcial (sem usar page layout). </fo:block> </fo:flow></fo:page-sequence>...</fo:root>
Exemplo
InfoView2002 231
Exemplo<xsl:template match="chapter"> <fo:flow> <xsl:apply-templates/> </fo:flow></xsl:template>
<xsl:template match="chapter/title"> <fo:block font-size="18pt" font-weight="bold" text-align="centered"> <xsl:apply-templates/> </fo:block></xsl:template>
<xsl:template match="para"> <fo:block font-size="12pt" space-before="1pc" text-align="justified"> <xsl:apply-templates/> </fo:block></xsl:template>
<xsl:template match="emphasis"> <fo:inline font-style="italic"> <xsl:apply-templates/> </fo:inline></xsl:template>
InfoView2002 232
page-sequence-- a parte maior (tal como body) na qual o layout de página
pode diferir de outras partes
flow-- um capítulo ou divisão de seção dentro de uma page-sequence
block-- um parágrafo (ou title ou block quote, etc.)
inline-- uma mudança de fonte dentro de um parágrafo
list FOs--list-block, list-item, list-item-label, list-item-body
graphic--referencia um objeto gráfico externo
table FOs--análogo a table model em HTML
Alguns Formatting Objects (FO)
InfoView2002 233
fonte
margens e espaçamento
bordas
alinhamento horizontal/justification
endentação
dentre outros ...
Propriedades básicas
InfoView2002 234
<?xml version="1.0"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:template match="article"> <fo:page-sequence font-family="serif" font-size="12pt"> <xsl:apply-templates/> </fo:page-sequence></xsl:template>
<xsl:template match="chapter"> <fo:flow> <xsl:apply-templates/> </fo:flow></xsl:template>
<xsl:template match="para"> <fo:block space-before="6pt"> <xsl:apply-templates/> </fo:block></xsl:template><!--(continua no próximo slide) -->
Exemplo Final
InfoView2002 235
<xsl:template match="chapter/title"> <fo:block font-family="sans-serif" color="blue" font-weight="bold" font-size="18pt" space-after="0.5em"> <xsl:number level="multiple" count="chapter"/> <xsl:text> </xsl:text>
<xsl:apply-templates/> </fo:block></xsl:template><xsl:template match="section/title"> <fo:block font-family="sans-serif" font-weight="bold" font-size="16pt" space-after="0.5em"> <xsl:number level="multiple" count="chapter|section"/> <xsl:text> </xsl:text> <xsl:apply-templates/> </fo:block></xsl:template><xsl:template match="article/title"> <fo:block font-family="sans-serif" font-size="24pt" space-after="2pc"> <xsl:apply-templates/> </fo:block></xsl:template></xsl:stylesheet>
Exemplo (cont)
InfoView2002 236
Consulta a dados semi-estruturados
InfoView2002 237
Requisitos desejáveis (Maier ’98) Expressividade
linguagem de consulta ao estilo SQL possibilitar a restruturação de dados semi-estruturados
Semântica precisa muito importante para XML
Composição o resultado de uma consulta deve poder ser
utilizado dentro de uma outra consulta Consulta ao esquema
visando otimização Facilitar a geração automática de consultas
Consulta
InfoView2002 238
Expressões de caminho (Path expressions)
Expressões que permitem navegar no grafo de dados
Expressões de caminho simples sequências de labels exemplos
root.pessoas {&p1,&p2,&p3}root.pessoas.filhos {&p2,&p3}
semântica o resultado de uma expressão de caminho r.l1. … .ln,
onde l1,…,ln são os labels e r um objeto, é o conjunto de nodos do grafo acessíveis de r por um caminho do grafo tal que os arcos percorridos passam sucessivamente pelos labels l1,…,ln.
InfoView2002 239
Expressões de caminho Expressões de caminho generalizadas Idéia: além de especificar completamente um caminho,
permite exprimir restrições (constraints) sobre o caminho
Utilização de expressões regulares Exemplos
_ é um caracter coringa que designa um label qualquer
(pessoa|estudante)._.idade As expressões de caminho definidas até o presente
retornam os conjuntos de objetos e não de dados semi-estruturados
Consulta
InfoView2002 240
Linguagem de Consulta
X-Query
InfoView2002 241
XQuery
Baseda em Quilt (que é baseda em XML-QL)
http://www.w3.org/TR/xquery/2/2001
XML Query data model
InfoView2002 242
FLWR (“Flower”) ExpressionsFOR ... LET... WHERE...RETURN...
InfoView2002 243
XQuery
Encontre os títulos dos livros publicados após 1995:
FOR $x IN document("bib.xml")/bib/book
WHERE $x/year > 1995
RETURN $x/title
FOR $x IN document("bib.xml")/bib/book
WHERE $x/year > 1995
RETURN $x/titleResultado: <title> abc </title> <title> def </title> <title> ghi </title>
InfoView2002 244
XQueryPara cada autor de um livro publicado pela
Morgan Kaufmann, listar os livros publicados:
FOR $a IN distinct(document("bib.xml") /bib/book[publisher=“Morgan Kaufmann”]/author)
RETURN <result>
$a,
FOR $t IN /bib/book[author=$a]/title
RETURN $t
</result>
FOR $a IN distinct(document("bib.xml") /bib/book[publisher=“Morgan Kaufmann”]/author)
RETURN <result>
$a,
FOR $t IN /bib/book[author=$a]/title
RETURN $t
</result>
distinct = elimina duplicatas
InfoView2002 245
XQuery
Resultado: <result> <author>Jones</author> <title> abc </title> <title> def </title> </result> <result> <author> Smith </author> <title> ghi </title> </result>
InfoView2002 246
XQuery
FOR $x in expr -- liga $x a cada valor na lista expr
LET $x = expr -- liga $x à inteira lista expr Usado para subexpressões comuns e
para agregações
InfoView2002 247
XQuery
count = função (aggregate) que retorna o número de elementos
<big_publishers>
FOR $p IN distinct(document("bib.xml")//publisher)
LET $b := document("bib.xml")/book[publisher = $p]
WHERE count($b) > 100
RETURN $p
</big_publishers>
<big_publishers>
FOR $p IN distinct(document("bib.xml")//publisher)
LET $b := document("bib.xml")/book[publisher = $p]
WHERE count($b) > 100
RETURN $p
</big_publishers>
InfoView2002 248
XQuery
Encontre os livros cujos preços são maiores do que a média de preços:
FOR $b in document("bib.xml")/bib/book
LET $a=avg(document("bib.xml")/bib/book/price)
WHERE $b/price > $a
RETURN $b
FOR $b in document("bib.xml")/bib/book
LET $a=avg(document("bib.xml")/bib/book/price)
WHERE $b/price > $a
RETURN $b
InfoView2002 249
XQuery
Sumário: FOR-LET-WHERE-RETURN = FLWR
FOR/LET Clauses
WHERE Clause
RETURN Clause
Lista de tuplas
Lista de tuplas
Instância do modelo de dados Xquery
InfoView2002 250
FOR versus LET
FOR liga variáveis nodo iteration
LET liga variáveis coleção one value
InfoView2002 251
FOR versus LET
FOR $x IN document("bib.xml")/bib/book
RETURN <result> $x </result>
FOR $x IN document("bib.xml")/bib/book
RETURN <result> $x </result>
Retorna: <result> <book>...</book></result> <result> <book>...</book></result> <result> <book>...</book></result> ...
LET $x IN document("bib.xml")/bib/book
RETURN <result> $x </result>
LET $x IN document("bib.xml")/bib/book
RETURN <result> $x </result>
Retorna: <result> <book>...</book> <book>...</book> <book>...</book> ...</result>
InfoView2002 252
Coleções em XQuery
Conjuntos e Bags /bib/book/author = uma coleção do tipo Bag Distinct(/bib/book/author) = uma coleção do
tipo conjunto (Set) LET $a = /bib/book $a é uma coleção $b/author uma coleção (vários
autores...)RETURN <result> $b/author </result>RETURN <result> $b/author </result>
Retorna: <result> <author>...</author> <author>...</author> <author>...</author> ...</result>
InfoView2002 253
Ordenação em XQuery
<publisher_list> FOR $p IN distinct(document("bib.xml")//publisher) RETURN <publisher> <name> $p/text() </name> , FOR $b IN document("bib.xml")//book[publisher = $p] RETURN <book> $b/title , $b/price </book> SORTBY(price DESCENDING) </publisher> SORTBY(name) </publisher_list>
<publisher_list> FOR $p IN distinct(document("bib.xml")//publisher) RETURN <publisher> <name> $p/text() </name> , FOR $b IN document("bib.xml")//book[publisher = $p] RETURN <book> $b/title , $b/price </book> SORTBY(price DESCENDING) </publisher> SORTBY(name) </publisher_list>
Argumentos de sort referem-se ao namespace da cláusula RETURN e não da cláusula FOR
InfoView2002 254
If-Then-Else
FOR $h IN //holding
RETURN <holding>
$h/title,
IF $h/@type = "Journal"
THEN $h/editor
ELSE $h/author
</holding> SORTBY (title)
FOR $h IN //holding
RETURN <holding>
$h/title,
IF $h/@type = "Journal"
THEN $h/editor
ELSE $h/author
</holding> SORTBY (title)
InfoView2002 255
Quantificador Existencial
FOR $b IN //book
WHERE SOME $p IN $b//para SATISFIES
contains($p, "sailing")
AND contains($p, "windsurfing")
RETURN $b/title
FOR $b IN //book
WHERE SOME $p IN $b//para SATISFIES
contains($p, "sailing")
AND contains($p, "windsurfing")
RETURN $b/title
InfoView2002 256
Quantificador Universal
FOR $b IN //book
WHERE EVERY $p IN $b//para SATISFIES
contains($p, "sailing")
RETURN $b/title
FOR $b IN //book
WHERE EVERY $p IN $b//para SATISFIES
contains($p, "sailing")
RETURN $b/title