Vous êtes sur la page 1sur 43

XML: uma introduo prtica

<xml:validao />
Helder da Rocha
www.argonavis.com.br

Por que validar?


Para a maior parte das aplicaes, um XML bem

formado suficiente
possvel, em documentos XML no vlidos

Montar a rvore usando DOM


Extrair ns, acrescentar ns, alterar o contedo dos

elementos usando SAX ou DOM


Transformar o documento em outro usando XSLT
Gerar um PDF ou um SVG com dados contidos no
documento
Exibir o XML em um browser usando CSS

Para que serve, ento, o trabalho de desenvolver um

DTD?

Definir uma linguagem


Para se ter uma linguagem precisa-se de um

esquema

Linguagem implica comunicao.


No h comunicao eficiente sem uma

conveno entre as partes sobre vocabulrios,


regras de formao, etc.

Definir um esquema
Documentos no vlidos so "individualistas"
Um esquema representa um conjunto de documentos,
que existem e que viro a existir
possvel fazer muitas coisas com UM documento no
vlido. difcil automatizar os processos sem considerar
uma CLASSE de documentos
Um esquema uma formalidade necessria
Se voc tem uma grande coleo de documentos que
foram construdos segundo determinadas regras, voc j
tem, informalmente, um esquema
Para validar documentos de acordo com suas convenes,
preciso ter um esquema
4

Classes vs. instncias


Um esquema define uma classe de

documentos

Os documentos que quiserem fazer parte dessa

classe devem aderir ao esquema

Um documento pode pertencer a vrias

classes

Um documento pode ser vlido em vrios

esquemas

Documentos vlidos
Documentos vlidos contm
Declarao de tipo de documento (para DTD), ou
<!DOCTYPE bilhete SYSTEM "bilhete.dtd">

Declarao de namespace e schema (para XML

Schema)

<bilhete codigo="ZMIKT8"
xmlns="urn:123456789"
xmlns:xsi="http://www.w3.
http://www.w3.org
org/2001/
/2001/XMLSchema
XMLSchema-instance"
xsi:schemaLocation="urn:123456789 bilhete.
bilhete.xsd">

Para validar
Use um validador (com suporte a Schema)
6

O que define um esquema

Um vocabulrio
Elementos, atributos
Uma gramtica
Relacionamentos
Uma coleo de entidades
No caso dos DTDs
7

Exemplo

<pessoa>
<nome>
<prenome>Richard</prenome>
<sobrenome>Feynman</sobrenome>
</nome>
<profisso>Fsico</profisso>
<profisso>Matemtico</profisso>
<profisso>Arrombador de cofres</profisso>
</pessoa>

DTD

<!ELEMENT
<!ELEMENT
<!ELEMENT
<!ELEMENT
<!ELEMENT

pessoa (nome, profissao*)>


nome (prenome, sobrenome)>
prenome (#PCDATA)>
sobrenome (#PCDATA)>
profissao (#PCDATA)>

Documento vlido

<!DOCTYPE pessoa SYSTEM


"http://pessoas.com/pessoa.dtd">
<pessoa>
<nome>
<prenome>Richard</prenome>
<sobrenome>Feynman</sobrenome>
</nome>
</pessoa>

10

Documento no vlido (1)


Por que?

<!DOCTYPE pessoa SYSTEM


"http://pessoas.com/pessoa.dtd">
<pessoa>
<nome>
<prenome>Richard</prenome>
</nome>
<profisso>Arrombador de cofres</profisso>
</pessoa>

11

Documento no vlido (2)


Por que?

<!DOCTYPE pessoa SYSTEM


"http://pessoas.com/pessoa.dtd">
<pessoa>
<profisso>Arrombador de cofres</profisso>
<nome>
<prenome>Richard</prenome>
<sobrenome>Feynman</sobrenome>
</nome>
<profisso>Fsico</profisso>
</pessoa>

12

DTD Externo SYSTEM


Como vincular
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE cartao-simples SYSTEM "cartao.dtd">
<cartao-simples>
<nome> (...)
nome do elemento
raiz do documento

onde buscar validao:


SYSTEM ou PUBLIC

URI ou
identificador

Elementos:
<!DOCTYPE> vincula o DTD a um documento
<!ELEMENT> define um elemento
<!ATTLIST> define os atributos de um elemento
<!ENTITY> define uma entidade ( ex: &nome; )
<!NOTATION> define uma notao interna para uma URI
13

DTD pblico
Comum em linguagens consolidadas
No precisa de URI, mas deve ser fornecida

por segurana
FPI: formal public identifier

arquivo chamado de "catalog" guardado com a

aplicao verifica o FPI


se no encontrar, busca o DTD na URI fornecida
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"
"http://www.w3.org/TR/REC-html40/strict.dtd">

14

DTD Interno
<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE pessoa [
<!ELEMENT pessoa (nome, profissao*)>
<!ELEMENT nome (prenome, sobrenome)>
<!ELEMENT prenome (#PCDATA)>
<!ELEMENT sobrenome (#PCDATA)>
<!ELEMENT profissao (#PCDATA)>
]>
<pessoa>
<nome>
<prenome>Richard</prenome>
</sobrenome>Feynman</sobrenome>
</nome>
</pessoa>

15

DTD incompleto
O DTD foi importado, mas est incompleto. Parte

dele definido localmente

<!DOCTYPE pessoa SYSTEM "pessoa.dtd"[


<!ELEMENT nome (#PCDATA)>
<!ENTITY dtd "Document Type Definition">
]>

Elementos, atributos e entidades definidos no

documento tm prioridade sobre declaraes


importadas

Processador l primeiro elementos locais, depois externos


A primeira declarao usada. Declaraes adicionais

para o mesmo elemento/atributo/entidade so


desconsideradas
16

DTD: exemplo

zero ou uma
ocorrncia

exatamente uma
ocorrncia cada

<!ELEMENT
<!ELEMENT cartao-simples
cartao-simples (( logotipo?,
logotipo?,
zero ou mais
nome,
nome, endereco,
endereco,
ocorrncias
definio de
email*,
email*,
elemento
uma ou mais
telefone+
telefone+ )) >>
ocorrncias
<!ELEMENT
<!ELEMENT logotipo
logotipo EMPTY
EMPTY >>
no pode conter outros ns
<!ATTLIST
<!ATTLIST logotipo
logotipo
(exceto atributos)
href
href CDATA
CDATA #REQUIRED
#REQUIRED >>
<!ELEMENT
<!ELEMENT nome
nome (( #PCDATA
#PCDATA )) >>
atributo obrigatrio
<!ELEMENT
<!ELEMENT endereco
endereco (( #PCDATA
#PCDATA )) >>
contm "Character DATA"
<!ELEMENT
<!ELEMENT email
email (( #PCDATA
#PCDATA )) >>
um ou
<!ELEMENT
<!ELEMENT telefone
telefone (( ddd,
ddd, numero
numero )) >>
valor default
o
outro
<!ATTLIST
<!ATTLIST telefone
telefone
tipo
tipo (( residencial
residencial || comercial
comercial )) "residencial"
"residencial"
lista de
codigo-pais
codigo-pais NMTOKEN
NMTOKEN #IMPLIED
#IMPLIED >>
atributos
<!ELEMENT
<!ELEMENT ddd
ddd (( #PCDATA
#PCDATA )) >>
atributo opcional
<!ELEMENT
<!ELEMENT numero
numero (( #PCDATA
#PCDATA )) >> contm nome ou nmero

17

<!ELEMENT>
Sintaxe
<!ELEMENT nome_do_elemento conteudo >

O contedo pode ser


(1) (#PCDATA),
(2) (uma seqncia),
(3) (uma lista para escolha),
(4) (contedo misto),
(5) a palavra EMPTY ou
(6) a palavra ANY.

18

#PCDATA
Parsed Character Data
Elemento pode conter texto
No pode conter elementos

19

Seqncias de Elementos-filho
O contedo deve ter uma lista de elementos

separados por vrgula


Podem ter sufixos indicando multiplicao
zero ou mais
+ um ou mais
? zero ou um

Exemplos
<!ELEMENT cartao (nome, telefone+,
email*, website?) >
<!ELEMENT trem (locomotiva, vagao*) >
20

Seleo de um Elemento-filho
Lista de elementos separada por |

(barra vertical)
Exemplos

<!ELEMENT trecho (ferrovirio | areo |


rodovirio | fluvial)* >
<!ELEMENT circulo (centro, (raio | diametro)) >
<!ELEMENT ponto ((x, y) | (r, )) >
<!ELEMENT nome (prenome | sobrenome |
(prenome, inicial*, sobrenome))>

21

Contedo misto
(#PCDATA | elem1 | ... | elemn)*
#PCDATA tem que ser o primeiro elemento
O * no final obrigatrio
No possvel controlar o nmero ou a estrutura

dos elementos

Exemplo: a seguinte declarao em DTD:


<!ELEMENT frase (#PCDATA | enfase)*>

permite o seguinte contedo


<frase>A frase que <enfase>ele</enfase>
leu no foi a que <enfase>ela</enfase>
ouviu.</frase>
22

Elementos Vazios e Any


Elementos que no podem conter nada devem

ser declarados como EMPTY


<!ELEMENT nome EMPTY>

Elementos EMPTY podem conter atributos


<!ATTLIST nome prenome CDATA #REQUIRED>

A declarao acima permite elementos como


<nome prenome="Jos" />

ANY: para elementos que podem conter

qualquer coisa

<!ELEMENT todos ANY>


23

<!ATTLIST>
Sintaxe
<!ATTLIST elemento
atributo1 tipo valor_default>
<!ATTLIST elemento
atributo2 tipo valor_default>
...

ou
<!ATTLIST elemento
atributo1
atributo2
atributo3
atributo4
... >

tipo
tipo
tipo
tipo

valor_default
valor_default
valor_default
valor_default
24

Exemplos
<!ATTLIST voo de NMTOKEN #IMPLIED >
<!ATTLIST voo numero CDATA #FIXED "12/32-1">
<!ATTLIST voo para (REC|CGH|GRU|SDU) #REQUIRED >
<!ATTLIST voo transportador (RG | JH) "RG" >

<!ATTLIST voo de NMTOKEN #IMPLIED


numero CDATA #FIXED "12/32-1"
para (REC|CGH|GRU|SDU) #REQUIRED
transportador (RG | JH) "RG" >

25

Tipos de dados

CDATA
NMTOKEN
NMTOKENS
Seleo
ID

IDREF
IDREFS
ENTITY
ENTITIES
NOTATION

26

CDATA e NMTOKEN
CDATA (character data) representa qualquer texto

arbitrrio

pode conter espaos, pontuao, etc.

NMTOKEN (name token). semelhante a um

nome de elemento ou atributo


caracteres alfanumricos
no pode conter espaos

NMTOKENS representa um ou mais NMTOKEN

separados por espaos.


<elemento atr="um dois trs 56 21">

27

Seleo
Uma Seleo uma lista de NMTOKENS de onde

pode-se escolher o valor do atributo. As escolhas so


separadas por |:
<!ATTLIST voo para (REC|CGH|SDU) #REQUIRED>
<!ATTLIST curso periodo (dia|noite) "noite">

Elementos no podem conter espaos ou outros

caracteres no-alfanumricos
Tipo NMTOKEN!

28

ID
Atributos do tipo ID tem que conter um nome (e no

NMTOKEN) que seja unvoco no documento.

Nome tem mesmas regras que identificador XML

(caracteres alfanumrico, no comea com nmero, etc.)

No se pode usar um nmero como ID.


A soluo colocar um prefixo antes do nmero que seja
ou uma letra ou um sublinhado.
Elementos s podem ter um tipo ID.
No pode haver outro elemento na mesma pgina com
mesmo ID
Exemplos
<!ATTLIST voo codigo ID #REQUIRED>
<!ATTLIST piloto numero ID #REQUIRED>

29

IDREF
IDREF referncia para um ID. Exemplo:
<!ATTLIST piloto alocado IDREF #REQUIRED>

Aplicao (codigo e numero so IDs)


<aeroporto>
<voo codigo="RG123"> ... </voo>
<voo codigo="RG456"> ... </voo>
<piloto numero="S1" alocado="RG123">
... </piloto>
<piloto numero="S2" alocado="RG456">
... </piloto>
</aeroporto>
30

IDREFS
Lista de elementos IDREF. Exemplo:
<!ATTLIST piloto alocado IDREFS #REQUIRED>

Aplicao (codigo e numero so IDs)


<aeroporto>
<voo codigo="RG123"> ... </voo>
<voo codigo="RG456"> ... </voo>
<piloto numero="S2"
alocado="RG456 RG123">
... </piloto>
</aeroporto>

31

Valores default
#REQUIRED: fora o autor do documento a definir

um valor explcito ao atributo.


#IMPLIED: o atributo opcional.
#FIXED: o atributo tem um valor fixo, constante

Valor no pode ser mudado


Autor no precisa definir atributo e, se o fizer, no pode

mudar o valor. Exemplo:


<!ATTLIST valor moeda CDATA #FIXED "US$">

Valor inicial, entre aspas


Autor no precisa definir atributo, mas pode mud-lo
<!ATTLIST voo companhia (RG | JH) "RG" >
<!ATTLIST endereco pais CDATA "Brasil" >
32

<!NOTATION> e tipo NOTATION


Associa URI a um nome
Usado frequentemente para associar valores CDATA a
NMTOKEN (mesmo onde no h URIs)
Exemplos
<!NOTATION amazon SYSTEM "http://www.amazon.com">
<!NOTATION barnes SYSTEM "http://www.bn.com">

Tipo NOTATION de <!ATTLIST> til em situaes

onde no se pode usar CDATA


<!ATTLIST book
store NOTATION (amazon | barnes) #REQUIRED>

Assim pode-se limitar melhor valores dos atributos


<book store="amazon" />

33

<!ENTITY>
Vrios tipos de <!ENTITY>
Constantes usadas nos DTDs e documentos XML
De parmetro (%nome; - s no DTD)
internas - incluem texto definido localmente
externas - incluem sub-DTDs de arquivos externos
Gerais (&nome; - s no XML)
internas (texto local - sempre processadas)
caracter - &#333; &#x3AB4
globais - &lt; &amp;
definidas pelo usurio

externas (carregam arquivos externos)


processadas - incluem texto no XML
no-processadas - incluem formatos binrios (como imagens)
34

Entidades gerais internas


<!ENTITY nome "valor">
Exemplos:
<!ENTITY empresa "ACME Indstria &amp;
Comrcio de Coisas S.A.">
<!ENTITY copyright "<table>
<tr>
<td>Copyright &#x00A9 2000</td>
</tr>
</table>">
Uso: &nome; no documento XML
<texto> Visite a &empresa; ainda hoje!.
</texto>
<div> &copyright; </div>
35

Entidades gerais externas


Carregam texto de arquivos externos

<!ENTITY nome SYSTEM "uri">


<!ENTITY nome PUBLIC "fpi" "uri">
Exemplo
<!ENTITY menu_sup SYSTEM "/sec/menu.xml">

Uso
<elemento>
&menu_sup;
</elemento>

Contedo de menu.xml:
<menu>
Texto
</menu>

Resultado
<elemento>
<menu>
Texto
</menu>
</elemento>
36

Entidades externas no processadas


Usadas para carregar dados que no podem ser

processados (que no so texto) atravs de atributos

<!ENTITY nome SYSTEM "uri" NDATA notao>

Depende de uma declarao NOTATION


Neste caso tpico usada para informar tipo de dados
Exemplo de uso no DTD
<!NOTATION gif SYSTEM "image/gif">
<!ENTITY logo SYSTEM "logo.gif" NDATA gif>

Atributos podem declarar receber tipo ENTITY


<!ATTLIST imagem fonte ENTITY #REQUIRED>

Uso no XML:
<imagem fonte="logo">

37

Entidades de parmetro
<!ENTITY % nome "valor">
Variveis para uso dentro do DTD
Exemplos. Em vez de repetir ...
<!ATTLIST voo de (REC|CGH|GRU|GIG|SDU)>
<!ATTLIST voo para (REC|CGH|GRU|GIG|SDU)>

Declare as entidades
<!ENTITY % aerosp "CGH|GRU">
<!ENTITY % aerorio "GIG|SDU">

E use as entidades no DTD


<!ENTITY % aeros "REC|%aerorio;|%aerosp;">
<!ATTLIST voo de (%aeros;) #REQUIRED >
<!ATTLIST voo para (%aeros;) #REQUIRED >
38

Entidades de parmetro externas


Carregam trechos de DTD de outros arquivos

<!ENTITY % nome SYSTEM "uri">


Exemplo
<!ENTITY % tabela SYSTEM "voos.dtd">

preciso chamar a entidade dentro do DTD.


Resultado
Uso
<!ENTITY ...>
%tabela;
<!ELEMENT ...>
...

<!ENTITY ...>
<!ENTITY % sp "CGH|GRU">
<!ENTITY % rio "GIG|SDU">
<!ELEMENT ...>

Contedo de voos.dtd:
<!ENTITY % sp "CGH|GRU">
<!ENTITY % rio "GIG|SDU">

39

Condicionais
Servem para construir DTDs configurveis
Ignora o contedo
<![IGNORE [
<!ELEMENT detalhes (#PCDATA)>
]]>

Declara que o contedo deve ser interpretado


<![INCLUDE [
<!ELEMENT detalhes (#PCDATA)>
]]>

Parecem inteis, no?


40

Utilidade das condicionais


Um DTD com declaraes "desligadas"
<!ENTITY % define.mod.um "IGNORE">
<!ENTITY % define.mod.dois "IGNORE">
<![%define.mod.um [
<!ELEMENT coisas (#PCDATA)>
]]>
<![%define.mod.dois [
<!ELEMENT maiscoisas (#PCDATA)>
]]>

Na utilizao, pode-se ligar as declaraes:


<!DOCTYPE raiz SYSTEM "coisas.dtd" [
<!ENTITY % define.mod.um "INCLUDE">
]>
<raiz>
<coisas> ... </coisas>

41

Namespaces e XML Schema


DTDs validam "documentos", no "linguagens"
DTDs supem que documentos contm apenas uma
linguagem
DTDs no suportam namespaces. Para declarar um

elemento preciso usar o nome qualificado:

<!ELEMENT prefixo:elemento (#PCDATA) >

Para validar namespaces em vez de documentos, use

XML Schema
Cada namespace pode ser associado a um esquema

diferente (um documento pode ter vrios esquemas)


DTDs ainda podem ser usados, para declarar, por
exemplo, entidades.
42

Validao: alm do DTD


DTD
vantagem: simples
desvantagens: (1) no usa sintaxe XML; (2) limitado.
XML Schema
vantagem: (1) XML; (2) permite validao mais
detalhada.
desvantagem: muito mais complicado que DTD
XML Schema ainda no resolve todos os problemas
H outras alternativas: Trax, Relax, Schematron
Em certos casos preciso realizar validao adicional
usando alguma linguagem (Python, Java)
43