Programação por Objectos
Documentos anotados
MEEC@IST
XML – 1/57
Definição (1)
• A formatação de documentos é realizada segundo
duas metodologias:
1. Embutir: a formatação é absorvida internamente
pela ferramenta por comandos especiais (via
teclado ou menus) e o utilizador vê apenas o
resultado final.
•
•
•
Referida por What You See is What You Get
Exemplos: Microsoft Word.
Vantagens:
– Simplicidade.
– Evita processamento intermédio.
MEEC@IST
XML – 2/57
Definição (2)
2. Anotação: marcas são visíveis no próprio
documento, sendo processadas por uma
ferramenta para gerar a apresentação.
•
•
Exemplos: LaTeX, HTML, XML.
Vantagens:
–
–
–
–
MEEC@IST
Flexibilidade.
Independente do Hardware e do dispositivo de
visualização.
Facilita desenvolvimento de ferramentas
processadoras dos documentos.
Dá maior liberdade ao utilizador para estabelecer as
suas definições de estrutura e formatação.
XML – 3/57
XML – introdução (1)
•
•
•
•
O XML (Extensible Makup Language) exprime informação:
– estruturada, através de anotações.
– com semântica, através de atributos.
Documentos escritos em XML armazenados em ficheiros de
extensão .xml
Definida em 1996 para o W3C - http://www.w3.org/XML/
“Chapéu de chuva” para tecnologias relacionadas:
– Identificação da estrutura de documentos: SAX, DOM
(ambos disponibilizados no J2SE)
– Transformação de documentos XML para XML: XSLT
– Definição de formatações: CSS
– …
MEEC@IST
XML – 4/57
XML – introdução (2)
• Vantagens:
– Fácil desenvolver ferramentas para processar documentos.
– Muito usado para transporte de informação entre
aplicações distintas.
• Inconvenientes:
– Pouco legível.
– Aumenta significativamente dimensão dos documentos.
• Suportado pelos navegadores mais divulgados:
– IE 5.0+
– Netscape 6.0+
MEEC@IST
XML – 5/57
XML – introdução (3)
• Um elemento é uma parte de um documento, sendo
delimitado por marcas <marca> e </marca>.
– <disciplina>POO</disciplina>
– <vazio/> para elementos nulos
(equivalente a <vazio></vazio>)
– O XML distingue nas marcas as letras maiúscula e
minúscula: <Disciplina>AED</disciplina> é um
elemento incorrecto!
MEEC@IST
XML – 6/57
XML – introdução (4)
• Um atributo é um qualificador do elemento, indicado
junto da marca na forma nome=“valor”
– Um elemento pode conter mais de um atributo, todos
separados por espaços:
<curso univ="IST" lic="LEEC ">
• Elementos podem conter outros elementos
aninhados, mas NÃO entrelaçados!
– Aninhado (certo): <A> <B></B> </A>
– Entrelaçado (incorrecto): <A> <B> </A> </B>
• Um documento XML é uma árvore de elementos.
MEEC@IST
XML – 7/57
XML – introdução (5)
<curso univ="IST" lic="LEEC">
<disciplina>
<tipo>BEEC</tipo>
<nome semestre="inverno">Algoritmos e Estruturas Dados</nome>
<docente>Prof. Rui Gustavo Crespo</docente>
</disciplina>
<disciplina>
<tipo>AE</tipo>
<nome semestre= "primavera">Programação por Objectos</nome>
<docente>Prof. Rui Gustavo Crespo</docente>
</disciplina>
curso
<disciplina>
<tipo>TFC</tipo>
</disciplina>
disciplina
</curso>
tipo
MEEC@IST
nome
docente
XML – 8/57
XML – introdução (6)
• Comentários delimitados por <!-- e -->
• Caracteres usados nas marcas são substituídos no
texto por referências a entidades pré-definidas, na
forma &id;
MEEC@IST
Caracter
Substituição
<
&lt;
>
&gt;
&
&amp;
‘
&apos;
“
&quot;
XML – 9/57
XML – introdução (7)
Um dado deve ser elemento ou atributo?
– Elementos
•
•
Estruturas de dados (os atributos representados
apenas por cadeias de caracteres).
Dados destinados ao utilizador.
– Atributos
•
•
MEEC@IST
Dados com poucas alternativas, raramente
modificados.
Dados destinados preferencialmente ao
processamento XML.
XML – 10/57
XML – introdução (8)
• XML não é um “HTML evoluído”!!!
– XML desenvolvido para descrição de
informação.
– HTML desenvolvido para apresentação de
informação.
MEEC@IST
XML – 11/57
XML – formato documento (1)
• Todos os ficheiros XML possuem o formato
[ prólogo ] elemento
1. O prólogo contém:
a) <?xml ... ?> declaração do tipo de documento
(obrigatório) com atributos:
• version – versão do XML (obrigatório)
• encoding – conjunto de caracteres usados (por
omissão, UTF-8)
• standalone – versão independente de definições
externas (por omissão, sim)
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
MEEC@IST
XML – 12/57
XML – formato documento (2)
b) Declaração do tipo do documento <!DOCTYPE, contendo:
1. Marca da raíz.
2. Referência ao documento que define a sintaxe dos
elementos e seus atributos, para validação do
documento. (nota: ler secção DTD)
3. Declaração de entidades <!ENTITY...>, delimitadas
por [ ]
4. Fecho >
2. O documento XML contém exactamente um elemento
raíz que, por seu turno, usualmente contém outros
elementos aninhados em árvore.
MEEC@IST
XML – 13/57
XML – entidade (1)
• Uma entidade é declarada na forma
<!ENTITY nome "texto">
(nota: o texto pode ser um elemento)
• Uma entidade é referida na forma &nome;
MEEC@IST
XML – 14/57
XML – entidade (2)
<?xml version=“1.0”?>
<!DOCTYPE mensagem
[
<!ENTITY sign "Prof. Rui Crespo">
<!ENTITY tel “<telef>x 2398</telef>">
]
>
<mensagem>
<hello>Caro colega!</hello>
<corpo>Peço que me ajudes na
vigilância do exame no dia 28 de
Janeiro, às 9:00, no Salão Nobre. Dá
uma apitadela para o telefone &tel;.
Saudações académicas.
&sign;
</corpo>
</mensagem>
MEEC@IST
Documento com entidades resolvidas:
<?xml version=“1.0”?>
<!DOCTYPE mensagem>
<mensagem>
<hello>Caro colega!</hello>
<corpo>Peço que me ajudes na
vigilância do exame no dia 28 de
Janeiro, às 9:00, no Salão Nobre. Dá
uma apitadela para o telefone
<telef>x 2398</telef>.
Saudações académicas.
Prof. RuiCrespo
</corpo>
</mensagem>
XML – 15/57
DTD – introdução (1)
• O DTD (Document Definition Type) define a estrutura
que o documento deve seguir.
• Nos ficheiros XML, o DTD é indicada no prólogo,
dentro do DOCTYPE.
– Se o documento obedecer às regras do DTD, é
considerado válido.
– Se não for indicado o DTD, o documento apenas
pode ser considerado bem formatado.
MEEC@IST
XML – 16/57
DTD – introdução (2)
1. O DTD é indicado no ficheiro XML no DOCTYPE
depois do elemento raíz, numa de 2 formas:
A. PUBLIC: objecto de acesso geral
−
"(+|-) // responsável // tipo-versão // língua"
» + indica DTD normalizado, - não normalizado
» Língua são dois caracteres (ex: EN-Inglês)
– URL: indicado entre " (http://, ou file:///drive:/…)
B. SYSTEM: recurso (ficheiro ou URL)
(nota: directórios separados por /, mesmo no Windows)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<!DOCTYPE raiz SYSTEM "file:///C:/Documents and Settings/RGC/exemplo.dtd">
MEEC@IST
XML – 17/57
DTD – introdução (3)
2. O DTD possui sequência de directivas definidoras
das seguintes estruturas:
1. Elementos
<!ELEMENT idElem categoria>
<!ELEMENT idElem (conteúdo)>
2. Atributos
<!ATTLIST idElem idAttr tipo [valOmissao]>
MEEC@IST
XML – 18/57
DTD – elementos (1)
Estruturas dos elementos:
–
–
–
–
EMPTY - obrigatoriamente vazia.
ANY - qualquer combinação de elementos.
(#PCDATA) Qualquer sequência de caracteres.
(ListaElem) Sequência de elementos e de caracteres,
separados por vírgulas, com operadores:
? Opcional.
| Alternativo.
* Zero, uma ou mais repetições.
+ Uma, ou mais repetições.
MEEC@IST
XML – 19/57
DTD – elementos (2)
<!ELEMENT artigo (titulo, subtitulo?, autor+, (secção, txt)+)>
<!ELEMENT titulo (#PCDATA)>
<!ELEMENT txt (#PCDATA)>
•
•
•
Um artigo tem um título, seguindo opcionalmente pelo subtítulo,
seguido de um autor (pelo menos) e continua por uma (ou mais)
sequência formadas por uma secção e texto.
O título é uma sequência de caracteres.
O texto é uma caracteres.
MEEC@IST
XML – 20/57
DTD – elementos (3)
<artigo>
<titulo>Distributed Resolution of Feature Interactions for
Internet Applications</titulo>
<autor>Rui Gustavo Crespo, Luigi Logrippo</autor>
<seccao>Resumo</seccao>
<txt>Propõe-se a criação de conselheiros em cada nó, que
propõem a resolução de interacções não desejadas entre serviços
com base num conjunto de fórmulas deônticas.</txt>
<seccao>Introdução</seccao>
<txt>...</txt>
<seccao>Arquitectura</seccao>
<txt></txt>
<seccao>Conclusões e trabahos futuros</seccao>
<txt></txt>
</artigo>
MEEC@IST
XML – 21/57
DTD – atributos (1)
Tipos de atributos:
Tipo
MEEC@IST
Valores possíveis
CDATA
Qualquer cadeia de caracteres
(en1|en2|…)
Um dado enumerado
ID
Identificador único
IDREF
Identificador de outro elemento
IDREFS
Lista de outros identificadores
NMTOKEN
Nome válido XML
NMTOKENS
Lista de nomes válidos XML
ENTITY
Entidade
ENTITIES
Lista de entidades
NOTATION
Notação
XML – 22/57
DTD – atributos (2)
Valores por omissão: o valor por omissão pode ser um
literal, ou uma classe #ccc.
Tipo
Significado
valor
Valor por omissão
#REQUIRED
Atributo obrigatório
#IMPLIED
Atributo pode não ser incluído
#FIXED valor
Valor do atributo é fixo
DTD
<!ELEMENT tel EMPTY>
<!ATTLIST tel num CDATA "0">
XML válido
<tel/>
<tel num=“2398”/>
MEEC@IST
<! -- numero é 0 -->
<! -- numero é 2398 -->
XML – 23/57
DTD – atributos (3)
DTD
XML válido
<!ELEMENT pessoa>
<pessoa nMec="2531">RG Crespo</pessoa>
<!ATTLIST pessoa nMec #REQUIRED>
XML inválido
<pessoa>RG Crespo</pessoa>
DTD
XML válido
<!ELEMENT fac>
<!ATTLIST fac univ #FIXED "UTL">
<fac univ=“UTL">IST</fac>
XML inválido
<fac>Instituto Superior Técnico</fac>
DTD
XML válido
<!ELEMENT pag>
<pag>620</pag>
<! -- equiv -->
<!ATTLIST pag meio (nota|cred)"nota"> <pag meio="nota">620</pag> <! -- equiv -->
<pag meio="cred">1200</pag>
MEEC@IST
XML – 24/57
DTD – inconvenientes
• O ficheiro DTD não é formatado em XML.
• Todos os dados (elementos e atributos) são cadeias
de caracteres: não é possível forçar inteiros.
• Dificuldade em exprimir subelementos não ordenados
(importante para BDs).
• ID e IDREF não possuem tipos.
Solução alternativa: XML Schema.
MEEC@IST
XML – 25/57
Análise de documentos XML (1)
• O processamento de documentos escritos em XML
baseia-se em ferramentas de análise sintáctica
(parser).
• Há 2 ferramentas que adoptam estratégias distintas
no processamento do documento:
1. SAX – (Simple API for XML)
Percorre o documento e lança um evento cada
vez que encontra um elemento.
2. DOM – (Document Object Model)
Constrói uma representação em árvore de todo o
documento.
MEEC@IST
XML – 26/57
Análise de documentos XML (2)
• Ferramentas disponibilizadas:
– SAX: SourceForge e J2SE
– DOM: W3Ce J2SE
– MSXML (da Microsoft): embutido no navegador
IE, versões 5.0+
– Mozilla (da Netscape): embutido no navegador
Netscape versões 6.0+
MEEC@IST
XML – 27/57
Análise de documentos XML (3)
• Vantagens relativas do SAX/DOM:
– SAX
•
•
Consome pouca memória.
Usado em documentos extensos, quando se pretende
aceder apenas a alguns elementos.
– DOM
•
•
MEEC@IST
Permite aceder a elementos já processados.
Usado se for necessário alterar documento XML.
XML – 28/57
Análise de documentos XML (4)
• Análise do documento segue os seguintes passos:
– Criar instância do analisador.
– Passar o documento para o objecto criado.
Nota: implementações do DOM recorrem
frequentemente ao SAX para realizar a análise
sintáctica inicial do documento XML.
MEEC@IST
XML – 29/57
Introdução ao SAX (1)
• SAX (Simple API for XML) é uma interface comum a
vários analisadores sintácticos, que reconhecem em
série os elementos de documentos expressos em
XML.
• Desenvolvido em 1998 por David Megginson,
disponível para diversas linguagens:
– Java (v2, divulgada em 2000, acessível no
endereço http://www.saxproject.org/ e
incorporado no J2SE)
– Perl, C++, Python
MEEC@IST
XML – 30/57
Introdução ao SAX (2)
• O analisador sintáctico SAX, quando reconhece
posições específicas do documento, chama métodos
(operação designada por lançamento de evento).
• As 4 posições mais importantes são:
1.
2.
3.
4.
Início do documento
Início do elemento
Fim do elemento
Fim do documento
• SAX pode também identificar os atributos de elementos.
• SAX gera excepções nos documentos inválidos.
MEEC@IST
XML – 31/57
Introdução ao SAX (3)
• O SAX e o DOM são APIs:
– residentes no JAXP (Java API for XML
Processing) da J2SE.
– definidos genericamente no pacote
javax.xml.parsers.
– os APIs básicos são definidos no pacote
org.xml.sax.
• Classes a importar:
import javax.xml.parsers.*;// analisadores SAX e DOM
import org.xml.sax.*;// API genérica do SAX
import org.xml.sax.helpers.*;// manipuladores
MEEC@IST
XML – 32/57
Introdução ao SAX (4)
Arquitectura geral
Aplicação
Analisador
startDocument()
Documento
em XML
Manipuladores
(handler)
startElement()
endElement()
…
MEEC@IST
XML – 33/57
Manipuladores (1)
• O SAX trabalha com 4 manipuladores (handlers)
definidos pelas interfaces:
– public interface ContentHandler: notificação dos
eventos relacionados com o documento XML.
– public interface DTDHandler: notificação dos
eventos relacionados com o DTD.
– public interface EntityResolver: para resolução
de entidades externas.
– public interface ErrorHandler: para resolução
de erros.
MEEC@IST
XML – 34/57
Manipuladores (2)
MEEC@IST
XML – 35/57
Manipuladores (3)
• DefaultHandler é a classe base de aplicações SAX,
que implementa o manipulador ContentHandler.
public class DefaultHandler extends java.lang.Object
implements EntityResolver, DTDHandler,
ContentHandler, ErrorHandler
• Usualmente o programador herda o DefaultHandler.
MEEC@IST
XML – 36/57
Manipulador de conteúdos (1)
•
Métodos do ContentHandler, que podem ser redefinidos pelo
utilizador:
– public void startDocument();
– public void endDocument();
// texto existente no elemento
– public void characters(char[] ch, int start,
int length);
// marca indicada em tag, atributos em atts
– public void startElement(String uri,
String name, String tag, Attributes atts);
– public void endElement(String uri,
String name, String tag);
MEEC@IST
XML – 37/57
Manipulador de conteúdos (2)
public class Main extends DefaultHandler{
static String fileName;
public void startDocument(){
System.out.println("Inicio analise de "+ fileName);
}
public void endDocument(){
System.out.println(“Concluida analise");
}
public void startElement(String uri, String name,
String tag, Attributes atts){
System.out.print("Elemento <" + tag + "> ");
}
public void characters(char[]ch,int start,int length){
System.out.print(new String(ch,start,length));
}
MEEC@IST
XML – 38/57
Manipulador de conteúdos (3)
public static void main(String[] argv) throws Exception {
fileName = argv[0];
// cria analisador SAX
SAXParserFactory fact = SAXParserFactory.newInstance();
SAXParser saxParser = fact.newSAXParser();
// analisa o documento com este manipulador
DefaultHandler handler = new Main();
saxParser.parse(new File(fileName), handler);
}
}
MEEC@IST
XML – 39/57
Manipulador de conteúdos (4)
•
Usando como ficheiro de entrada:
<?xml version="1.0"?>
<Disciplina>
<nome>Programacao por Objectos</nome>
<aluno>
<numero>34914</numero>
<resultado>16</resultado>
</aluno>
<aluno>
<numero>36731</numero>
<resultado/>
</aluno>
</Disciplina>
MEEC@IST
XML – 40/57
Manipulador de conteúdos (5)
•
Obtém-se a seguinte saída:
Inicio analise de C:\Users\PO\AnaliseDoc\test\Test.txt
Elemento <Disciplina>
Elemento <nome> Programacao por Objectos
Elemento <aluno>
Elemento <numero> 34914
Elemento <resultado> 16
Elemento <aluno>
Elemento <numero> 36731
Elemento <resultado>
Concluida analise
MEEC@IST
XML – 41/57
Manipulador de conteúdos (6)
• O método startElement normalmente contém
código na forma:
if (tag.equals("objecto1")
new Classe-objecto1();
else if (tag.equals("objecto2")
new Classe-objecto2();
/*…*/
else
System.err.println(“Erro");
MEEC@IST
XML – 42/57
Manipulador de conteúdos (7)
• Os elementos são identificados em série e para cada
um é chamdao o método startElement.
• Se o programador pretender aceder livremente os
elementos, eles devem ser guardados numa
estrutura (Vector,…).
• A ferramenta DOM armazena os elementos numa
árvore, que pode ser navegada pelo programador!!!
MEEC@IST
XML – 43/57
Manipulador de conteúdos (8)
• Para que o analisador sintáctico verifique a validade
do documento, contra o DTD é necessário chamar o
método setValidating.
SAXParserFactory fact = SAXParserFactory.newInstance();
fact.setValidating(true);
SAXParser saxParser = fact.newSAXParser();
MEEC@IST
XML – 44/57
Acesso a atributos (1)
• Os atributos não são reportados por eventos.
• Todos os atributos de um elemento são passados
como último parâmetro do método startElement.
• Os atributos são uma lista não ordenada (pode não
coincidir com a ordem do documento original) de
Attributes.
MEEC@IST
XML – 45/57
Acesso a atributos (2)
• Métodos da interface Attributes:
– public int getLength()
número de atributos na lista
– public String getLocalName(int index)
identificador do atributo na posição index
– public String getType(int index)
tipo do atributo na posição index ("CDATA", "ID", "IDREF",
"IDREFS", "NMTOKEN", "NMTOKENS", "ENTITY", "ENTITIES"
ou "NOTATION")
– public String getValue(int index)
valor do atributo na posição index
MEEC@IST
XML – 46/57
Manipulador de erros (1)
• Durante a análise de documentos expressos em
XML podem ocorrer erros diversos:
– Acesso ao documento.
– Má formatação do documento.
– Má configuração do analisador sintáctico.
• Para tratar os erros, uma solução reside na sua
captura por um catch.
MEEC@IST
XML – 47/57
Manipulador de erros (2)
public static void main(String[] argv) {
SAXParserFactory fact = SAXParserFactory.newInstance();
try{
SAXParser saxParser = fact.newSAXParser();
DefaultHandler handler = new Main();
saxParser.parse(new File(argv[0]), handler);
} catch(IOException e) {
System.err.println(“Erro IO”);
} catch(SAXException e) {
System.err.println(“Erro analise”);
} catch(ParserConfigurationException e) {
System.err.println(“Erro configuracao analisador”);
}
}
MEEC@IST
XML – 48/57
Manipulador de erros (3)
•
A interface ErrorHandler define métodos chamados sempre
que o analisador detecta no documento um erro, segundo
classes indicadas pelo W3C.
– public void warning(SAXParseException exception)
throws SAXException
erro não fatal, por omissão nada é feito.
– public void error(SAXParseException exception)
throws SAXException
erro grave, por exemplo, não cumprimento da restrição
de validade, por omissão nada é feito.
– public void fatal(SAXParseException exception)
throws SAXException
erro fatal, por exemplo, documento incorrectamente
formatado, que deve fazer abortar a análise.
MEEC@IST
XML – 49/57
Manipulador de erros (4)
• Os métodos de warning, error e falal são
implementados no DefaultHandler, mas podem
(e, tipicamente, devem) ser redefinidos pelo
programador.
MEEC@IST
XML – 50/57
Introdução ao DOM (1)
• DOM (Document Object Model) é uma interface
comum a vários analisadores sintácticos, que gera
uma árvore formada pelos elementos de documentos
expressos em XML.
• Classes a importar:
import javax.xml.parsers.*;
// analisadores SAX e DOM
import org.w3c.dom.*;
// API genérica do DOM
MEEC@IST
XML – 51/57
Introdução ao DOM (2)
Arquitectura geral
Analisador
Documento
em XML
Aplicação
navega
getFirstChild()
getParentNode()
…
MEEC@IST
XML – 52/57
Introdução ao DOM (3)
• O analisador DOM devolve um objecto Document,
posicionado na raiz.
public static void main(String[] argv) throws Exception{
// cria analisador DOM
DocumentBuilderFactory fact =
DocumentBuilderFactory.newInstance();
DocumentBuilder builder = fact.newDocumentBuilder();
// obtém o documento
Document doc = builder.parse(new File(argv[0]));
// obtém localização da raíz
Node node = doc.getDocumentElement();
}
MEEC@IST
XML – 53/57
Acesso a nós (1)
• Constantes: Node define 18 constantes para
determinar os tipo de nós.
Constante
Tipo de nó
ATTRIBUTE_NODE
ATTR
CDATA_SECTION_NODE
CData
COMMENT_NODE
Comentário
ELEMENT_NODE
Elemento
ENTITY_NODE
Entidade
TEXT_NODE
Texto
MEEC@IST
XML – 54/57
Acesso a nós (2)
• Hierarquia de interfaces
<<interface>>
Attr
<<interface>>
CharacterData
<<interface>>
Node
<<interface>>
Document
<<interface>>
Comment
<<interface>>
Text
<<interface>>
CDATASection
<<interface>>
Element
<<interface>>
NodeList
<<interface>>
Entity
…
MEEC@IST
XML – 55/57
Acesso a nós (3)
•
Alguns métodos de Node (39 ao todo):
1. Pesquisa sobre descendentes:
– boolean hasChildNodes(): tem descendentes?
– NodeList getChildNodes(): obtém lista de nós
descendentes.
2. Navegação por nós:
– Node getParentNode(): obtém nó ascendente.
– Node getFirstChild(): obtém nó descendente mais à
esquerda.
– Node getLastChild(): obtém nó descendente mais à
direita.
– Node getNextSibling(): obtém nó imediatamente à
direita.
MEEC@IST
XML – 56/57
Acesso a nós (4)
3. Informação sobre nós:
– short getNodeType(): tipo de nó.
– String getNodeValue(): valor do nó, que depende do
tipo.
MEEC@IST
XML – 57/57
Download

XML