Processamento de dados XML



Documentos relacionados
Sistemas de Informação: XML- Java

Manipulação de XML JAXP - DOM

Processamento de dados XML

Orientação a Objetos

PROGRAMAÇÃO ORIENTADA A OBJETOS -TRATAMENTO DE EXCEÇÕES. Prof. Angelo Augusto Frozza, M.Sc. frozza@ifc-camboriu.edu.br

Especialização em desenvolvimento para web com interfaces ricas. Tratamento de exceções em Java Prof. Fabrízzio A. A. M. N. Soares

CURSO DE PROGRAMAÇÃO EM JAVA

Comandos de repetição For (inicialização; condição de execução; incremento/decremento) { //Código }

DOM Document Object Model

Exercícios de Revisão Java Básico

Descrição. Implementação. Departamento de Informática e Estatística Universidade Federal de Santa Catarina LAB 4 Transferência de Arquivos

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

Desenvolvimento OO com Java Orientação a objetos básica

TUTORIAL DO ACCESS PASSO A PASSO. I. Criar um Novo Banco de Dados. Passos: 1. Abrir o Access 2. Clicar em Criar um novo arquivo

Aula 2. Objetivos. Encapsulamento na linguagem Java; Utilizando a referência this.

FBV - Linguagem de Programação II. Um pouco sobre Java

Especificação do 3º Trabalho

Prototype, um Design Patterns de Criação

Memória Flash. PdP. Autor: Tiago Lone Nível: Básico Criação: 11/12/2005 Última versão: 18/12/2006. Pesquisa e Desenvolvimento de Produtos

1.6. Tratamento de Exceções

JSP - ORIENTADO A OBJETOS

Bacharelado em Ciência e Tecnologia Processamento da Informação. Equivalência Portugol Java. Linguagem Java

Java. Marcio de Carvalho Victorino

Documentação Usando o Javadoc

Manual do Desenvolvedor Criptografia de Arquivos do WebTA

Bacharelado em Ciência e Tecnologia BC Processamento da Informação Teoria Arquivos Prof. Edson Pinheiro Pimentel edson.pimentel@ufabc.edu.

Aplicações, durante a execução, podem incorrer em muitas espécies de erros de vários graus de severidade Quando métodos são invocados sobre um objeto:

Laboratório de Banco de Dados Aula 1 Acesso a Banco de Dados. Prof. Josenildo Silva jcsilva@ifma.edu.br

ARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo.

Acesso a Banco. Conexão em Java. Conexão em Java. Programação Orientada a Objetos Profa. Cristiane e Prof. Daniel

Universidade da Beira Interior Cursos: Matemática /Informática e Ensino da Informática

Tabela de Símbolos. Análise Semântica A Tabela de Símbolos. Principais Operações. Estrutura da Tabela de Símbolos. Declarações 11/6/2008

Manipulação de Arquivos

Aula 1 Acesso a Banco de Dados

ATRIBUTOS PRIVADOS 6. ENCAPSULAMENTO MÉTODOS PRIVADOS MÉTODOS PRIVADOS

Guia de Fatores de Qualidade de OO e Java

public Agenda() { compromissos = null; } public int getnumerodecompromissos() { if (compromissos==null) return 0; else return compromissos.

EXERCÍCIOS SOBRE ORIENTAÇÃO A OBJETOS

Criando documentação com javadoc

Chamadas Remotas de Procedimentos (RPC) O Conceito de Procedimentos. RPC: Programa Distribuído. RPC: Modelo de Execução

Laboratório de Computação VI JAVA IDL. Fabricio Aparecido Breve

Programação de Computadores - I. Profª Beatriz Profº Israel

BSI UFRPE Prof. Gustavo Callou

XML e Banco de Dados de Internet. Tópicos Especiais em Tecnologia da Informação Profa. Késsia R. C. Marchi

insfcanceof new public switch transient while byte continue extends for int null

Java : Comunicação Cliente-Servidor.

Java 2 Standard Edition Como criar classes e objetos

Projeto de Software Orientado a Objeto

PROGRAMAÇÃO ESTRUTURADA. CC 2º Período

Escola Superior de Gestão e Tecnologia. Tratamento de Exceções

Curso Adonai QUESTÕES Disciplina Linguagem JAVA

Trabalho 3: Agenda de Tarefas

Programação de Computadores - I. Profª Beatriz Profº Israel

2ª LISTA DE EXERCÍCIOS CLASSES E JAVA Disciplina: PC-II. public double getgeracaoatual() {return geracaoatual;}

Implementando uma Classe e Criando Objetos a partir dela

Persistência de Dados

Um documento XML possui Unidade lógica - os elementos Usuário "inventa" as marcas através de DTDs

Objetivos: Sun recomenda que utilize o nome de domínio da Internet da empresa, para garantir um nome de pacote único

Capítulo 13. Encapsulamento. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Programação Orientada a Objetos e Java - Introdução. Carlos Lopes

Aula 2. Objetivos Conceitos; Instalação do Text Pad; Entendendo o código java do AloMundo1 Codificação do AloMundo2,AloMundo3 e AloMundo4.

NetBeans. Conhecendo um pouco da IDE

INF PROGRAMAÇÃO II LISTA DE EXERCÍCIOS 15

CAPÍTULO 7 NÍVEL DE LINGUAGEM DE MONTAGEM

Um pouco do Java. Prof. Eduardo

Como construir um compilador utilizando ferramentas Java

Orientação a Objetos com Java

Sistemas Operacionais 3º bimestre. Dierone C.Foltran Jr.

Linguagem de Programação III

Prof. Marcelo Machado Cunha

Manual de Integração

Encapsulamento de Dados

A ) O cliente terá que implementar uma interface remota. . Definir a interface remota com os métodos que poderão ser acedidos remotamente

Prova de Java. 1) Copie o programa abaixo no eclipse e complete-o, utilizando os conceitos aprendidos durante o curso. (4 pontos)

2 Orientação a objetos na prática

Introdução a Java. Hélder Nunes

UNIVERSIDADE FEDERAL DO PARANÁ

Como Gerar documento em PDF com várias Imagens

ArpPrintServer. Sistema de Gerenciamento de Impressão By Netsource Rev: 02

Lista de Contas: Assinatura. Lista de Contas. Listas de Contas: Descrição. Listas de Contas: Descrição. Listas de Contas: Descrição

NOVIDADES DO JAVA PARA PROGRAMADORES C

Tutorial Gerar arquivo PDF. Gerando um documento pdf com várias imagens 1- Inserir imagem no Word

Manipulação de Banco de Dados com Java. Ms. Bruno Crestani Calegaro Maio/ 2015

Desenvolvimento Web com Framework Demoiselle versão 1.0

Capítulo 4. Packages e interfaces

Sistemas Distribuídos

Parte I. Demoiselle Mail

Análise de Programação

Técnicas de Programação II

8. Outros tipos de Transação (Modo de Transação de Autoconfirmação e Modo Implícito)

Transcrição:

Processamento de dados XML Vanessa Braganholo Vanessa Braganholo

Introdução } Dois pontos básicos: } Como escrever um documento XML? } Como ler um documento XML? 2

Escrevendo um documento XML } Documentos XML } Podem ser escritos à mão usando um editor } Podem ser gerados automaticamente } Troca de dados, protocolos entre aplicativos } Importação/exportação entre diferentes formatos de dados (relacional -> xml, xml -> relacional, etc.) } Marcação de saída é relativamente fácil: fprintf(sdtout, "<para>paragrafo</para>"\n); System.ou.printl("<para>paragrafo</para>"n\); Clibs.puts("<para>paragrafo</para>"\n); 3

Lendo um documento XML } Software pode ser usado para escrever um documento XML } Software deve ser usado para ler um documento XML } Infelizmente a leitura é mais complexa do que a escrita } Várias questões: } Caracteres como "enter" "espaços em branco" devem ser sempre tratados } Substituir as entidades no texto } Processar DTD/XML Schema 4

Lendo um documento XML } Especificação XML -- na W3C -- } Fornece todas as informações } O que deve ser tratado durante a leitura de um documento XML } Para ler um documento XML } Necessidade de um módulo de processamento "XMLsensitive" } Processador XML Torna o documento XML acessível por uma aplicação Detecta formatos que não podem ser processados Entidades que não são recursos válidos 5

Processador XML Processamento XML Árvore DOM Ler <?xml version="1.0"> <raiz>... </raiz> Acesso via API Aplicação Escrever Eventos SAX 6

Processador XML <xml...>............ Processador XML Aplicação Dados Erros ------- ----- - ---- - --- ---- --- -- --- --- ----- - --- --- ----- -- --- --- - --- -- - ----- -- ---- Especificação da linguagem XML 7

Manipulador de Entidades } Manipulador de entidades } parte do processador XML } responsável por localizar fragmentos de documentos } responsável por manipular a substituição das referências } Os fragmentos de documentos podem ser } declarações de entidades } outros arquivos de dados 8

Manipulador de Entidades figura Aplicação <xml...>............ Processador XML Manipulador de entidades Dados Erros ------- ----- - ---- - --- ---- --- -- --- --- ----- - --- --- ----- -- --- --- - --- -- - ----- -- ---- Especificação da linguagem XML 9

Parser } O Parser é a parte do processador XML responsável por verificar a integridade dos dados XML } Um parsing pode ser executado de dois modos: } sem validação } com validação. } Parsing sem validação } verifica se o documento é bem formado } Parsing com validação } verifica se o documento é bem formado } verifica se o documento é válido 10

Parser figura Aplicação <xml...>............ Processador XML Manipulador de entidades Parser Dados Erros DTD ou XML Schema ------- ----- - ---- - --- ---- --- -- --- --- ----- - --- --- ----- -- --- --- - --- -- - ----- -- ---- Especificação da linguagem XML 11

Exemplo Parser Online } http://www.w3.org/2001/03/webdata/xsv 12

APIs e Processadores } APIs } DOM } SAX } Processadores } Xerces } Oracle XML Processor } Microsoft XML Processor } Outros... 13

SAX vs. DOM cliente pedido data Ana Maria 10/10/2000 nome compra produto qtd caneta 2 <?xml version="1.0"?> <pedido> <cliente>ana Maria</cliente> <data>10/10/2000</data> <compra> <produto> <nome>caneta</nome> <qtd>2</qtd> </produto> </compra> </pedido> startdocument startelement pedido stabrtelement cliente caracteres Ana Maria endelement cliente startelement data caracteres 10/10/2000 endelement data startelement compra startelement produto startelement nome caracteres caneta endelement nome startelement qtd caracteres 2 endelement qtd endelement produto endelement compra endelement pedido enddocument 14

SAX vs. DOM: como escolher? } DOM é melhor quando: } A estrutura de um documento XML precisa ser modificada } Alterar posições de nodos inserir, excluir, ordenar } Trocar nodos de uma árvore para outra } Compartilhar o documento na memória com outras aplicações } As aplicações compartilham a mesma instância do objeto } O tamanho do documento não é muito grande } A aplicação precisa acessar a mesma parte do documento várias vezes 15

SAX vs. DOM: como escolher? } SAX é melhor quando: } Questões de memória e performance são críticas } Documento é muito grande para ficar em memória } A aplicação não precisa reconhecer a estrutura do documento XML } SAX "varre" o documento XML uma única vez } O status de "qual é o contexto no momento" precisa ser mantido 16

Material de Vanessa Braganholo e Carina Dorneles SAX Simple API for XML

Introdução } Padrão desenvolvido na lista de e-mail XML-DEV } http://www.saxproject.org/ } Apesar de não ter sido desenvolvida por um órgão oficial regulador de padrões, SAX tornou-se um padrão de facto e é um software livre para uso privado e comercial } Primeira versão: maio de 1998 18

Introdução } SAX é uma API padrão para processamento de dados XML baseado em eventos } O parser entrega informação para o aplicativo disparando eventos 19

Call-backs e interfaces } O aplicativo } instancia um objeto parser, fornecido por um desenvolvedor } manda executar o parsing de um documento ou stream de dados através do objeto parser } Enquanto processa os dados XML, o parser } detecta partes significativas tais como start-tag, end-tag, erros, etc, } envia esta informação para o aplicativo utilizando um mecanismo de call-backs 20

Exemplo: parsing SAX <pedido> <cliente> <razao_social>abc</razao_social> <cgc>00.000.000/0001-00</cgc> </cliente> <itens_pedido> <item> <produto>caneta azul</produto> <quantidade>100</quantidade> <preco_unit>2</preco_unit> </item> </itens_pedido> </pedido> 21

Exemplo: parsing SAX start document start element: pedido start element: cliente start element: razao_social characters: ABC end element: razao_social start element: cgc characters: 00.000.000/0001-00... end element: cliente start element: itens_pedido start element: item start element: produto characters: caneta azul end element: produto... end document 22

Mecanismo de call-backs O aplicativo cria um ou vários objetos cujos métodos são utilizados pelo parser para informar a ocorrência de eventos O aplicativo passa referências a estes objetos para o parser O parser aceita os objetos e os utiliza no processamento dos dados 23

Interfaces } Os objetos que o parser aceita devem pertencer a uma classe que define uma ou várias interfaces SAX (org.xml.sax.*) } Deste modo, o parser } sabe que os métodos necessários estão presentes } executa chamadas aos métodos apropriados de acordo com a ocorrência dos eventos. 24

Interfaces SAX 2.0 Interface XMLReader Implementada pelo parser propriamente dito. Interface ContentHandler Manipula eventos básicos de marcação - início de documento, início de elemento, etc. Interface Attributes Manipula atributos Interface ErrorHandler Manipula erros Interface EntityResolver manipula entidades 25

Interfaces SAX 2.0 (cont.) Interface Locator localização de cada erro - linha/coluna Interface DTDHandler Eventos relacionados a DTDs Interface XMLFilter Filtro XML 26

Classe DefaultHandler (SAX 2.0) } Implementa as interfaces EntityResolver DTDHandler ContentHandler ErrorHandler com um comportamento default. 27

Outras classes da API SAX 2.0 Classe SAXNotSupportedException Classe SAXNotRecognizedException Classe SAXException Encapsula erros e warnings gerais de SAX Classe SAXParseException Encapsula erros e warnings de parsing 28

Hierarquia de Interfaces interface org.xml.sax.attributes interface org.xml.sax.contenthandler interface org.xml.sax.dtdhandler interface org.xml.sax.entityresolver interface org.xml.sax.errorhandler interface org.xml.sax.locator interface org.xml.sax.xmlreader interface org.xml.sax.xmlfilter 29

Hierarquia de Classes class java.lang.object class org.xml.sax.helpers.attributesimpl (implements org.xml.sax.attributes) class org.xml.sax.helpers.defaulthandler (implements org.xml.sax.contenthandler, org.xml.sax.dtdhandler, org.xml.sax.entityresolver, org.xml.sax.errorhandler) class org.xml.sax.helpers.locatorimpl (implements org.xml.sax.locator) class org.xml.sax.helpers.namespacesupport class org.xml.sax.helpers.parseradapter (implements org.xml.sax.documenthandler, org.xml.sax.xmlreader) class org.xml.sax.helpers.xmlfilterimpl (implements org.xml.sax.contenthandler, org.xml.sax.dtdhandler, org.xml.sax.entityresolver, org.xml.sax.errorhandler, org.xml.sax.xmlfilter) class org.xml.sax.helpers.xmlreaderadapter (implements org.xml.sax.contenthandler, org.xml.sax.parser) class org.xml.sax.helpers.xmlreaderfactory 30

Hierarquia de Classes (p/ Exceções) class java.lang.object class java.lang.throwable (implements java.io.serializable) class java.lang.exception class org.xml.sax.saxexception class org.xml.sax.saxnotrecognizedexception class org.xml.sax.saxnotsupportedexception class org.xml.sax.saxparseexception 31

Atividade não contemplada pelo SAX } Escrever uma estrutura em formato XML } Essa característica, quando implementada, será diferente em cada parser 32

Construindo uma aplicação JAVA } API XML para Java: JAXP } http://java.sun.com/xml/downloads/jaxp.html } Usaremos a classe DefaultHandler } } } Implementação com características default Criar uma classe que ESTENDE a classe DafaultHandler Além disso, precisamos de alguma implementação do PARSER propriamente dito (aquele que lê o documento e dispara os eventos para a nossa aplicação) } Em Java, o parser já vem no JAXP, e é a classe SAXParser } Uma instância da classe SAXParser pode ser obtida através da Factory SAXParserFactory } Em outras linguagens, a implementação do parser provavelmente estará disponível em alguma classe que implementa a interface XMLReader 33

Construindo uma aplicação JAVA import java.io.*; import org.xml.sax.*; import org.xml.sax.helpers.defaulthandler; import javax.xml.parsers.saxparserfactory; import javax.xml.parsers.parserconfigurationexception; import javax.xml.parsers.saxparser; public class MySAXApp extends DefaultHandler { public MySAXApp () { } super(); Acompanhem o exemplo no arquivo MySAXApp.java, no diretório exercicio1 Documentação JAVA: http://docs.oracle.com/javase/7/docs/api/index.html 34

Classe main public static void main (String argv[]) throws Exception { if (argv.length!= 1) { System.err.println("Modo de usar: MySAXApp <arquivo XML>"); System.exit(1); } // Informa quem é o gerenciador de eventos SAX DefaultHandler handler = new MySAXApp(); // Usa o parsing default (sem validação) SAXParserFactory factory = SAXParserFactory.newInstance(); } try { // Faz o parsing SAXParser saxparser = factory.newsaxparser(); saxparser.parse( new File(argv[0]), handler ); } catch (Throwable t) { t.printstacktrace(); } System.exit(0); 35

Classe main public static void main (String argv[]) throws Exception { if (argv.length!= 1) { System.err.println("Modo de usar: MySAXApp <arquivo XML>"); System.exit(1); } // Informa quem é o gerenciador de eventos SAX DefaultHandler handler = new MySAXApp(); // Usa o parsing default (sem validação) SAXParserFactory factory = SAXParserFactory.newInstance(); } try { // Faz o parsing SAXParser saxparser = factory.newsaxparser(); saxparser.parse( new File(argv[0]), handler ); } catch (Throwable t) { t.printstacktrace(); } System.exit(0); O handler é uma instância da aplicação que estamos construindo! 36

Exercício 1 } Compilar a classe MySAXApp (dentro de exercicio1) e executá-la usando o arquivo pedido1.xml como parâmetro } Inserir um erro no arquivo pedido1.xml e executar a aplicação novamente } Para compilar: javac MySAXApp.java } Para executar: java MySAXApp pedido1.xml } Se o javac não estiver funcionando, adicione C:\Arquivos de programas\java\jdk1.6.0_21\bin no PATH (Painel de Controle, Sistemas, Avançado, Variáveis de Ambiente) 37

Interface XMLReader } Seus métodos dividem-se em três grupos } Métodos do tipo set } usados pela aplicação para registrar objetos no parser que correspondem a outras interfaces } Métodos do tipo parse } métodos deste grupo são utilizados pelo aplicativo para executar o parsing } Métodos do tipo get 38

Interface XMLReader (parse) void parse(inputsource input) Faz o parsing de um documento XML. void parse(string systemid) Faz o parsing de um documento XML a partir de um identificador de sistema (URI). Importantes para quem vai usar outra linguagem de programação que não Java 39

Interface XMLReader (set) void setcontenthandler(contenthandler handler) Permite que uma aplicação registre um ContentHandler void setdtdhandler(dtdhandler handler) Permite que uma aplicação registre um ContentHandler void setentityresolver(entityresolver resolver) Permite que uma aplicação registre um EntityResolver void seterrorhandler(errorhandler handler) Permite que uma aplicação registre um ErrorHandler void setfeature(string name, boolean value) Seta o valor de uma característica void setproperty(string name, Object value) Seta o valor de uma propriedade 40

Interface XMLReader (get) ContentHandler getcontenthandler() Retorna o ContentHandler DTDHandler getdtdhandler() Returna o DTDHandler EntityResolver getentityresolver() Retorna o EntityResolver ErrorHandler geterrorhandler() Retorna o ErrorHandler Boolean getfeature(string name) Retorna o valor de uma característica Object getproperty(string name) Retorna o valor de uma propriedade 41

Funcionamento } Depois de registrar um ou mais objetos no parser, a aplicação chama um dos métodos parse } O parser começa a ler os dados XML } Quando um objeto significativo é encontrado, o parser pára e a informação é enviada para o aplicativo chamando o método apropriado através de um dos objetos registrados } O parser espera o método retornar para continuar o processamento. 42

Para manipular o conteúdo do documento XML... } O programador deve implementar os métodos da interface ContentHandler } Através desses métodos, o aplicativo trata os eventos disparados pelo parser 43

Interface ContentHandler void characters(char[] ch, int start, int length) Recebe notificação do recebimento de caracteres (conteúdo de um elemento) void enddocument() Recebe notificação de final de documento void endelement(string uri, String localname, String qname) Recebe notificação de final de elemento void processinginstruction(string target, String data) Recebe notificação de instrução de processamento void startdocument() Recebe notificação de início de documento void startelement(string uri, String localname, String qname, Attributes atts) Recebe notificação de início de elemento 44

Interface ContentHandler void endprefixmapping(string prefix) Termina o escopo de um mapeamento de prefixo void ignorablewhitespace(char[] ch, int start, int length) Recebe notificação de espaço em branco ignorável void setdocumentlocator(locator locator) Recebe um objeto para localizar a origem dos eventos SAX void skippedentity(string name) Recebe notificação de uma entidade ignorada void startprefixmapping(string prefix, String uri) Inicia o escopo de um mapeamento de prefixo de um namespace 45

Exemplo 46

startdocument e enddocument } O primeiro método chamado é startdocument e o último é enddocument } Métodos úteis para inicializar variáveis, abrir e fechar arquivos, etc public void startdocument() { total_pedido=0; } 47

Exercício 2 } Compilar a classe MySAXApp (dentro de exercicio2) e executá-la usando o arquivo pedido1.xml como parâmetro } Modificar a classe para adicionar o método enddocument que imprime final do documento na saída 48

startelement e endelement } O método startelement é chamado quando uma start-tag é encontrada no fluxo de dados } O método endelement é chamado quando uma end-tag é encontrada no fluxo de dados. 49

XML que está sendo processado <pedido numero="1000"> <cliente> <razao_social>abc</razao_social> <cgc>00.000.000/0001-00</cgc> </cliente> <itens_pedido> <item> <produto>caneta azul</produto> <quantidade>100</quantidade> <preco_unit>2</preco_unit> </item> <item> <produto>caneta preta</produto> <quantidade>200</quantidade> <preco_unit>1</preco_unit> </item> </itens_pedido> </pedido> 50

Exemplo public void startelement (String uri, String localname, String qname, Attributes atts) { pilha.push(qname); } 51

Exemplo URI do Namespace, ou string vazia se não houver namespace, ou se os namespaces não estiverem sendo processados public void startelement (String uri, String localname, String qname, Attributes atts) { pilha.push(qname); } Nome local (sem prefixo de namespace), ou string vazia se os namespaces não estiverem sendo processados Nome qualificado (com prefixo do namespace), ou string vazia se nome qualificado não estiver disponível 52

Exemplo public void startelement (String uri, String localname, String qname, Attributes atts) { pilha.push(qname); } public void endelement (String uri, String localname, String qname) throws SAXException { pilha.pop(); } (pilha é um objeto do tipo Stack) 53

characters } O método characters é chamado quando um string de texto é encontrado. O exemplo abaixo converte o array de entrada para um string simples e armazena o nome do cliente. public void characters (char[] ch, int start, int length) throws SAXException { if (pilha.peek().equals( razao_social )) String cliente = new String(ch,start,length); 54

Exercício 3 } Utilizar a classe MySAXApp (dentro de exercicio3) como base, e modificá-la para que ela processe o pedido pedido1.xml mostrando a seguinte saída: CLIENTE: ABC CGC: 00.000.000/0001-00 PRODUTO: caneta azul PRODUTO: caneta preta } Atenção!! Todos os métodos necessários já estão declarados! Basta colocar a implementação deles!!! 55

ignorablewhitespace } Este método é chamado quando um string de caracteres que podem ser ignorados é encontrado } Espaços em branco que aparecem em elementos que somente podem conter elementos são considerados caracteres ignoráveis } Quando um esquema não é utilizado este método não é chamado, pois o parser não é capaz de distinguir entre elementos que podem conter texto e elementos que só podem conter outros elementos 56

processinginstruction } processinginstruction } este método é chamado quando uma instrução de processamento é encontrada } o método recebe como parâmetros } nome da aplicação de destino } instrução de processamento 57

Exemplo public void processinginstruction(string target, String data) { if ( target.equals("acme") ) { // o aplicativo é o processador ACME if ( data.equals("new_page") ) { // quebra de página aqui... }... } } <?ACME new_page?> 58

Exercício 4 } Utilizar a classe MySAXApp (dentro de exercicio4) como base e modificá-la para encontrar as instruções de processamento do arquivo view1.xml e as exibir na tela } Atenção!! Exibir somente as instruções de processamento que contêm instruções SQL!! 59

Atributos } Quando o parser informa para a aplicação que uma startag foi encontrada, ele chama o método startelement } Uma start-tag pode conter um ou mais atributos 60

Atributos } Problema: } não existe limite no número de atributos que um elemento pode conter } portanto, esta informação não pode ser passada como parâmetro } Solução: } criar um objeto para encapsular todos os detalhes dos atributos } este objeto deve implementar a interface Attributes 61

Interface Attributes int getindex(java.lang.string qname) Retorna o índice de um atributo (sua posição no elemento) de nome qname int getindex(java.lang.string uri, java.lang.string localname) Retorna o índice de um atributo (sua posição no elemento) de nome uri : localname int getlength() Retorna o número de atributos da lista java.lang.string getlocalname(int index) Retorna o nome do atributo na posição indicada pelo parâmetro index java.lang.string getqname(int index) Retorna o nome do atributo na posição indicada pelo parâmetro index java.lang.string gettype(int index) Retorna o tipo do atributo na posição indicada pelo parâmetro index 62

Interface Attributes java.lang.string gettype(java.lang.string qname) Retorna o tipo do atributo de nome qname java.lang.string gettype(java.lang.string uri, java.lang.string localname) Retorna o tipo do atributo de nome uri : localname java.lang.string geturi(int index) Retorna o namespace do atributo na posição index java.lang.string getvalue(int index) Retorna o valor do atributo na posição index java.lang.string getvalue(java.lang.string qname) Retorna o valor do atributo de nome qname java.lang.string getvalue(java.lang.string uri, java.lang.string localname) Retorna o valor do atributo de nome uri : localname 63

Métodos getlength e getqname } getlength } retorna um valor inteiro que representa o número de atributos que o elemento possui } o valor zero indica que não existem atributos } cada atributo é identificado por um valor de índice, começando em zero. } getqname } recebe um valor de índice e retorna o nome do atributo correspondente. 64

Exemplo } Recupera o nome do último atributo String lastattribute = null; int totalatts = atts.getlength(); if ( totalatts > 0 ) lastattribute = atts.getqname(totalatts - 1); 65

Método getvalue } getvalue } retorna o valor de um atributo } é possível utilizar tanto um valor de índice quanto um nome de atributo como parâmetro. lastattvalue = atts.getvalue(totalatts - 1); 66

Método gettype } gettype } retorna informações sobre o tipo do atributo } quando uma DTD é utilizada, cada atributo possui um tipo de dados (CDATA, ID ou NMTOKEN) } quando o parser não possui acesso à DTD, o tipo default (CDATA) é utilizado 67

Exemplo } Reconstrói a lista de atributos original (declaração da DTD) public void startelement (String uri, String localname, String qname, Attributes atts) { System.out.print( "<!ATTLIST " + qname + " " ); for( int i =0; i < atts.getlength(); i++ ) { System.out.print( atts.getqname(i) + " " + atts.gettype(i) + " " + "#IMPLIED \"" + atts.getvalue(i) + "\" \n" ); } System.out.print( "> \n" ); } 68

Método getvalue } getvalue } recupera o valor de um atributo nomeado } o nome do atributo deve ser passado como parâmetro } se o atributo não existe, um valor nulo é retornado 69

Exemplo } Recupera o valor do atributo numero do elemento pedido public void startelement (String uri, String localname, String qname, Attributes atts) { } if (qname.equals("pedido")) num_pedido = atts.getvalue("numero"); 70

Exercício 5 } Utilizar a classe MySAXApp (dentro de exercicio5) como base e modificá-la para processar o pedido pedido1.xml, exibindo as seguintes informações: *************************************** PEDIDO NUMERO 1000 PROCESSADO! CLIENTE: ABC VALOR TOTAL: 400 *************************************** 71

Interface ErrorHandler } Um aplicativo implementa a interface ErrorHandler para ser informado sobre erros e warnings } Métodos: void error(saxparseexception exception) Recebe notificação sobre um erro recuperável void fatalerror(saxparseexception exception) Recebe notificação sobre um erro irrecuperável void warning(saxparseexception exception) Recebe notificação sobre um warning 72

Exemplos de tipo de erro } ERROR: erros de validação } FATAL ERROR: erro de má-formação do XML } WARNING: falha ao carregar alguma entidade externa } Atenção: Um erro fatal causa uma excessão no método parse por default, e o evento fatalerror não é disparado. Para forçar o disparo do evento, adicionar a linha factory.setfeature( http://apache.org/xml/features/ continue-after-fatal-error, true) 73

Exemplo } Mostra mensagem cada vez que um warning é disparado public void warning (SAXParseException exception) { System.out.print( "WARNING: " + exception); } 74

Suporte a namespaces } Para saber se o processamento de namespaces está setado: SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxparser = factory.newsaxparser(); saxparser.isnamespaceaware(); } Para setar o processamento de namespaces: SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setnamespaceaware(true); 75 Veja classe exemplo no diretório namespaces

Parser com validação na JAXP } Para fazer um parser com validação // Usa o parsing com validação SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setvalidating(true); } Implementar o método error para exibir os erros de validação: public void error(saxparseexception err) { System.out.println( "ERROR (" + err + ")"); } 76

Validação com XML Schema - JAXP } Declaração de constantes (só para facilitar, não é necessário) static final String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/ jaxp/properties/schemalanguage"; static final String W3C_XML_SCHEMA = "http://www.w3.org/2001/ XMLSchema"; } No método main da classe: SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setnamespaceaware(true); factory.setvalidating(true); SAXParser saxparser = factory.newsaxparser(); saxparser.setproperty(jaxp_schema_language, W3C_XML_SCHEMA); 77

Validação outras linguagens } A interface XMLReader tem o método setfeature que é usado, entre outras coisas, para setar a validação } Setar a feature validation para TRUE xr.setfeature("http://xml.org/sax/features/validation", true); } (xr é a referência para a classe que implementa a interface XMLReader) } Implementar o método error para exibir os erros de validação public void error(saxparseexception err) { System.out.println( "ERROR (" + err + ")"); } 78

Exercício 6 } Utilizar a classe MySAXApp (dentro de exercicio6) como base e modificá-la para processar o pedido pedido2.xml com validação } Inserir erros no documento (em relação à DTD) e executar o parsing } Vejam o que acontece quando vocês não implementam o método error() 79

Tratamento de Erros } Os erros podem ser tratados de forma mais especializada usando os métodos: error, fatalerror e warning 80

Outras interfaces } Mais específicas, usadas por quem precisa implementar um parser mais complexo } Interface Locator } Identifica o número de linha e o número do caractere que originou um erro no parsing } Interface DTDHandler } Informa sobre entidades binárias e declaração de notações } Interface EntityResolver } Intercepta referências a entidades } Detalhes sobre elas podem ser encontrados em http://www.saxproject.org/apidoc/org/xml/sax/packagesummary.html 81

Exercício 7 } Modificar a classe MySAXApp (dentro de exercicio7) para exibir a nota fiscal referente ao pedido. } Processe com o documento pedido3.xml, que possui dados do endereço do cliente. ABC 00.000.000/0001-00 Rua das Flores, 75 Porto Alegre RS ------------------------------------------------------ Produto Quant P.Unit. P.Total ------------------------------------------------------ caneta azul 100 2 200 papel 100 8 800 ------------------------------------------------------ 1000 82

Exercício 8 } Imprimir na tela o documento XML que está sendo lido. O arquivo MySAXApp (dentro de exercicio8) já contém a declaração dos métodos necessários } Testar com pedido3.xml e view1.xml 83

Fontes de Referência: } http://www.saxproject.org/apidoc/org/xml/sax/packagesummary.html (Documentação de todas as interfaces (em Java)) } Excelente tutorial da SUN sobre JAXP: http://java.sun.com/j2ee/1.4/docs/tutorial/doc/ JAXPSAX.html 84