XML API DOM e SAX Prof Dr Cludio

  • Slides: 57
Download presentation
XML API: DOM e SAX Prof. Dr. Cláudio Baptista baptista@dsc. ufcg. edu. br http:

XML API: DOM e SAX Prof. Dr. Cláudio Baptista baptista@dsc. ufcg. edu. br http: //www. lsi. dsc. ufcg. edu. br 1

Processamento de docs XML n Um arquivo XML é um arquivo de texto n

Processamento de docs XML n Um arquivo XML é um arquivo de texto n n Portanto, a manipulação de XML pode ser feita através da leitura deste texto Entretanto, existem APIs que facilitam este acesso a um doc XML 2

Parser XML n O parser tem a função de verificar se um doc XML

Parser XML n O parser tem a função de verificar se um doc XML está n n n sintaticamente correto; ou bem-formado O parser deve parar o processamento caso o documento não esteja bemformado (uma exceção é lançada) 3

Parser XML n n Lê o doc XML Verifica se é bem-formado Opcionalmente, Valida

Parser XML n n Lê o doc XML Verifica se é bem-formado Opcionalmente, Valida com um DTD ou XMLSchema Fornece uma API que facilita a manipulação do doc XML via aplicação 4

Processadores XML n Três tipos de API para XML parsing: n n n SAX

Processadores XML n Três tipos de API para XML parsing: n n n SAX (Simple API to XML): baseada em eventos DOM (Document Object Model): objetos/árvore JDOM (Java Documet Object Model): Objetos/árvores 5

Processadores XML n n Há parsers para várias plataformas e ambientes de software Parsers

Processadores XML n n Há parsers para várias plataformas e ambientes de software Parsers baseados em SAX são mais rápidos Parsers baseados em DOM são mais versáteis, pois criam uma versão em memória do documento inteiro Validação tende a ser mais lenta do que verificação 6

DOM n n n W 3 C standard recommendation Constrói árvore na memória para

DOM n n n W 3 C standard recommendation Constrói árvore na memória para documentos XML Um DOM Document é uma coleção de nodes organizada numa hierarquia DOM provê uma API que permite o programador adicionar, editar, mover, ou remover nodes em qualquer ponto da árvore DOM-based parsers fazem o “parsing” destas estruturas. Existe em várias linguagens (Java, C, C++, Python, Perl, etc. ) n n www. w 3. org/DOM/ java. sun. com/webservices/docs/1. 0/tutorial/doc/JAXPDOM. html 7

DOM n Manipulação XML com Java n Java XML Pack n n java. sun.

DOM n Manipulação XML com Java n Java XML Pack n n java. sun. com/xml/downloads/javaxmlpack. html Xerces – Apache XML Parser n n Antigo IBM/XML 4 J Suporta além de Java 1 e 2, C++, Perl dentre outros. 8

DOM Roadmap Um Parser analiza um arquivo XML para criar um DOM document que

DOM Roadmap Um Parser analiza um arquivo XML para criar um DOM document que é composto de nodes que podem ser elementos, atributos, textos, ou outros tipos de node que fazem parte de um (ou mais) Namespace(s) que podem ser acessados via métodos da DOM API 9

Evolução do DOM n n Level 0 - Foi a primeira recomendação que permitia

Evolução do DOM n n 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 10

Exemplo <? xml version="1. 0" encoding="UTF-8"? > <!DOCTYPE ORDERS SYSTEM "orders. dtd"> <orders> <order>

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="SA 15"> <name>Silver Show Saddle, 16 inch</name> <price>825. 00</price> <qty>1</qty> </item> <item instock="N" itemid="C 49"> <name>Premium Cinch</name> <price>49. 00</price> <qty>1</qty> </item> </order> <customerid limit="150">251222</customerid> <status>pending</status> <item instock="Y" itemid="WB 78"> <name>Winter Blanket (78 inch)</name> <price>20</price> <qty>10</qty> </item> </orders> 11

Exemplo (cont) 12

Exemplo (cont) 12

DOMParser n n DOMParser estende XMLParser Métodos importantes n void parse(Input. Source source) n

DOMParser n n DOMParser estende XMLParser Métodos importantes n void parse(Input. Source source) n n void parse(java. lang. String system. Id) n n Executa o parsing em source Executa o parsing sobre o arquivo identificado por system. Id Document get. Document() n Retorna o documento 13

Interface Node n n Corresponde a um nó na árvore DOM Node pode ser

Interface Node n n Corresponde a um nó na árvore DOM Node pode ser usado para referenciar: n n n n Elementos Atributos Texto Comentários Seções CDATA Entidades Documentos inteiros PI 14

Tipos básicos de nodes n n Document Element Attribute Text 15

Tipos básicos de nodes n n Document Element Attribute Text 15

DOM Introdução DOM tree Cada node representa um elemento, atributo, etc. <? xml version

DOM Introdução DOM tree Cada node representa um elemento, atributo, etc. <? xml version = "1. 0"? > <message from = ”Ana" to = ”Marta"> <body>Oi Marta!</body> </message> Node criado para elemento message Elemento 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 16

Implementações de DOM-based parsers Microsoft msxml Sun Microsystem JAXP 17

Implementações de DOM-based parsers Microsoft msxml Sun Microsystem JAXP 17

DOM: classes e interfaces. 18

DOM: classes e interfaces. 18

Alguns métodos de Document 19

Alguns métodos de Document 19

Métodos Node 20

Métodos Node 20

Navegação de um Node 21

Navegação de um Node 21

Manipulação de um Node 22

Manipulação de um Node 22

Alguns tipos de node 23

Alguns tipos de node 23

Métodos de Element 24

Métodos de Element 24

Parsing um arquivo XML num documento n Processo em 3 passos n n n

Parsing um arquivo XML num documento n Processo em 3 passos n n n 1. Criar o Document. Builder. Factory. Este objeto criará o Document. Builder. 2. Criar o Document. Builder. O Document. Builder fará o atual parsing criar o objeto Document. 3. Fazer o parsing do arquivo para criar o objeto Document. 25

Exemplo de aplicação básica import javax. xml. parsers. Document. Builder; import javax. xml. parsers.

Exemplo de aplicação básica import javax. xml. parsers. Document. Builder; import javax. xml. parsers. Document. Builder. Factory; import java. io. File; import org. w 3 c. dom. Document; public class Order. Processor { public static void main (String args[]) { File doc. File = new File("orders. xml"); Document doc = null; try { Document. Builder. Factory dbf = Document. Builder. Factory. new. Instance(); Document. Builder db = dbf. new. Document. Builder(); doc = db. parse(doc. File); } catch (Exception e) { System. out. print("Problem parsing the file. "); } } 26

Ex de aplicação básica import javax. xml. parsers. Document. Builder; import javax. xml. parsers.

Ex de aplicação básica import javax. xml. parsers. Document. Builder; import javax. xml. parsers. Document. Builder. Factory; import java. io. File; import org. w 3 c. dom. Document; import org. w 3 c. dom. Element; public class Order. Processor {. . . System. exit(1); } //Passo 1: obtém o elemento raiz (root) Element root = doc. get. Document. Element(); System. out. println("The root element is " + root. get. Node. Name()); } } 27

Ex de aplicação básica Obtendo um node filho. . . import org. w 3

Ex de aplicação básica Obtendo um node filho. . . import org. w 3 c. dom. Node. List; . . . //PASSO 1: obtém o elemento raiz(root) Element root = doc. get. Document. Element(); System. out. println("The root element is "+root. get. Node. Name()); //PASSO 2: obtém os filhos (children) Node. List children = root. get. Child. Nodes(); System. out. println("There are "+children. get. Length()+" nodes in this document. "); } } 28

Usando get. First. Child() e get. Next. Sibling(). . . import org. w 3

Usando get. First. Child() e get. Next. Sibling(). . . import org. w 3 c. dom. Node; . . . //PASSO 3: processando os filhos (children) for (Node child = root. get. First. Child(); child != null; child = child. get. Next. Sibling()) { System. out. println(child. get. Node. Name()+" = "+child. get. Node. Value()); } } }. . . 29

Múltiplos filhos. . . public class Order. Processor { private static void step. Through

Múltiplos filhos. . . public class Order. Processor { private static void step. Through (Node start) { System. out. println(start. get. Node. Name()+" = "+start. get. Node. Value()); for (Node child = start. get. First. Child(); child != null; child = child. get. Next. Sibling()) { step. Through(child); } } public static void main (String args[]) { File doc. File = new File("orders. xml"); . . . System. out. println("There are "+children. get. Length() +" nodes in this document. "); //PASSO 4: fazendo recursividade step. Through(root); } 30

Resultado: 31

Resultado: 31

Manipulando Atributos. . . import org. w 3 c. dom. Named. Node. Map; .

Manipulando Atributos. . . import org. w 3 c. dom. Named. Node. Map; . . . private static void step. Through. All (Node start) { System. out. println(start. get. Node. Name()+" = "+start. get. Node. Value()); if (start. get. Node. Type() == start. ELEMENT_NODE) { Named. Node. Map start. Attr = start. get. Attributes(); for (int i = 0; i < start. Attr. get. Length(); i++) { Node attr = start. Attr. item(i); System. out. println(" Attribute: "+ attr. get. Node. Name() +" = "+attr. get. Node. Value()); } } for (Node child = start. get. First. Child(); child != null; child = child. get. Next. Sibling()) { step. Through. All(child); } } 32

Manipulando Atributos 33

Manipulando Atributos 33

Edição de documentos XML n Existem métodos para n adicionar nodes, remover nodes, mudar

Edição de documentos XML n Existem métodos para n adicionar nodes, remover nodes, mudar valores de nodes n Consulte a API! n n 34

SAX n n Simple API for XML Outro método para acessar o conteúdo de

SAX n n Simple API for XML Outro método para acessar o conteúdo de documentos XML. Desenvolvido por membros da XML-DEV mailing-list (não é da W 3 C) Usa um modelo baseado em eventos n Notificações (eventos) ocorrem à medida em que o documento é analizado (“parsed”) 35

SAX-based Parsers SAX-based parsers Disponíveis em várias LPs: e. g. , Java, Python, C++,

SAX-based Parsers SAX-based parsers Disponíveis em várias LPs: e. g. , Java, Python, C++, etc. 36

Eventos SAX parser Invoca certos métodos quando eventos ocorrem Programadores devem fazer overriding destes

Eventos SAX parser Invoca certos métodos quando eventos ocorrem Programadores devem fazer overriding destes métodos para processar os dados 37

Métodos invocados pelo SAX parser 38

Métodos invocados pelo SAX parser 38

Como SAX funciona? Dado o documento XML abaixo: <? xml version="1. 0"? > <samples>

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 document Start 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) 39 End element (samples)

Como SAX funciona? Processamento em SAX envolve os seguintes passos 1. Criar um event

Como SAX funciona? Processamento em SAX envolve os seguintes passos 1. Criar um event handler 2. Criar o SAX parser 3. Associar o event handler ao parser criado 4. Fazer o parsing do documento, enviando cada evento ao event handler. 40

Exemplo: Uma pesquisa de opinião <? xml version="1. 0"? > <surveys> <response username="bob"> <question

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> 41 </surveys>

Criando um event handler import org. xml. sax. helpers. Default. Handler; public class Survey.

Criando um event handler import org. xml. sax. helpers. Default. Handler; public class Survey. Reader extends Default. Handler { public Survey. Reader() { System. out. println("Object Created. "); } public void show. Event(String name) { System. out. println("Hello, "+name+"!"); } public static void main (String args[]) { Survey. Reader reader = new Survey. Reader(); reader. show. Event(”Nick"); } 42 }

// Exemplo usando JAXP import org. xml. sax. helpers. Default. Handler; import javax. xml.

// Exemplo usando JAXP import org. xml. sax. helpers. Default. Handler; import javax. xml. parsers. SAXParser. Factory; import org. xml. sax. XMLReader; Criando o SAX parser public class Survey. Reader extends Default. Handler { public Survey. Reader() { } public static void main (String args[]) { XMLReader xml. Reader = null; try { SAXParser. Factory spfactory = SAXParser. Factory. new. Instance(); SAXParser sax. Parser = spfactory. new. SAXParser(); xml. Reader = sax. Parser. get. XMLReader(); } catch (Exception e) { System. err. println(e); System. exit(1); } } } 43

Associando o event handler ao parser. . . xml. Reader = sax. Parser. get.

Associando o event handler ao parser. . . xml. Reader = sax. Parser. get. XMLReader(); xml. Reader. set. Content. Handler(new Survey. Reader()); } catch (Exception e) {. . . 44

Parsing os dados . . . import org. xml. sax. Input. Source; . .

Parsing os dados . . . import org. xml. sax. Input. Source; . . . xml. Reader = sax. Parser. get. XMLReader(); xml. Reader. set. Content. Handler(new Survey. Reader()); Input. Source source = new Input. Source("surveys. xml"); xml. Reader. parse(source); } catch (Exception e) {. . . Pronto! Falta apenas definir os eventos. . . 45

Criando um Error. Handler. . . import org. xml. sax. SAXParse. Exception; public class

Criando um Error. Handler. . . import org. xml. sax. SAXParse. Exception; public class Survey. Reader extends Default. Handler { public Survey. Reader() { } public void error (SAXParse. Exception e) { System. out. println("Error parsing the file: "+e. get. Message()); } public void warning (SAXParse. Exception e) { System. out. println("Problem parsing the file: "+e. get. Message()); } public void fatal. Error (SAXParse. Exception e) { System. out. println("Error parsing the file: "+e. get. Message()); System. out. println("Cannot continue. "); System. exit(1); } public static void main (String args[]) {. . . 46

Associando o Error. Handler. . . xml. Reader. set. Content. Handler(new Survey. Reader()); xml.

Associando o Error. Handler. . . xml. Reader. set. Content. Handler(new Survey. Reader()); xml. Reader. set. Error. Handler(new Survey. Reader()); Input. Source source = new Input. Source("surveys. xml"); . . . 47

Eventos: start. Document(). . . import org. xml. sax. SAXException; public class Survey. Reader

Eventos: start. Document(). . . import org. xml. sax. SAXException; public class Survey. Reader extends Default. Handler {. . . public void fatal. Error (SAXParse. Exception e) { System. out. println("Error parsing " + "the file: "+e. get. Message()); System. out. println("Cannot continue. "); System. exit(1); } public void start. Document() throws SAXException { System. out. println("Tallying survey results. . . "); } public static void main (String args[]) {. . . 48

Eventos: start. Element(). . . import org. xml. sax. Attributes; public class Survey. Reader

Eventos: start. Element(). . . import org. xml. sax. Attributes; public class Survey. Reader extends Default. Handler {. . . public void start. Document() throws SAXException { System. out. println("Tallying survey results. . . "); } public void start. Element( String namespace. URI, String local. Name, String q. Name, Attributes atts) throws SAXException { System. out. print("Start element: "); System. out. println(local. Name); } public static void main (String args[]) { … } 49

start. Element(): pegando atributos. . . public void start. Element( String namespace. URI, String

start. Element(): pegando atributos. . . public void start. Element( String namespace. URI, String local. Name, String q. Name, Attributes atts) throws SAXException { System. out. print("Start element: "); System. out. println(local. Name); for (int att = 0; att < atts. get. Length(); att++) { String att. Name = atts. get. Local. Name(att); System. out. println(" " + att. Name + ": " + atts. get. Value(att. Name)); } }. . . 50

Obtendo Dados: characters() … // ch inclui o documento inteiro public void characters(char[] ch,

Obtendo Dados: characters() … // ch inclui o documento inteiro public void characters(char[] ch, int start, int length) throws SAXException { if (this. Element == "question") { print. Indent(4); System. out. print(this. Question + ": "); System. out. println(new String(ch, start, length)); } }. . . 51

Obtendo Dados: characters() 52

Obtendo Dados: characters() 52

Obtendo Dados: characters() (completo) public void end. Element( String namespace. URI, public void print.

Obtendo Dados: characters() (completo) public void end. Element( String namespace. URI, public void print. Indent(int indent. Size) { String local. Name, for (int s = 0; s < indent. Size; s++) { String q. Name) System. out. print(" "); throws SAXException { } this. Question = ""; } this. Element = ""; String this. Question = ""; } String this. Element = ""; public void characters(char[] ch, public void start. Element( int start, String namespace. URI, int length) String local. Name, throws SAXException { String q. Name, if (this. Element == "question") { Attributes atts) print. Indent(4); throws SAXException { System. out. print(this. Question + ": "); if (local. Name == "response") { System. out. println(new String(ch, System. out. println("User: " start, length)); + atts. get. Value("username")); } } else if (local. Name == "question") { } this. Question = atts. get. Value("subject"); . . . } this. Element = local. Name; 53 } . . .

SAX versus DOM Modelo baseado em árvore armazena o documento inteiro numa hierarquia de

SAX versus DOM Modelo baseado em árvore armazena o documento inteiro numa hierarquia de document nodes Dados são acessados rapidamente Provê facilidades para adicionar e remover nodes SAX Invoca métodos quando markup (tag) é encontrada Maior performance do que DOM Menos overhead de memória do que DOM Tipicamente usado para ler documentos (não para modificá-los) 54

JDOM – Java DOM n n n http: //www. jdom. org Interface OO específica

JDOM – Java DOM n n n http: //www. jdom. org Interface OO específica para Java baseada em DOM Vantagens: n n n As mesmas de DOM Interface OO muito mais rica que DOM Desvantagens n n Mesmas do DOM Limitado à Java 55

Toolkits XML n Java n n JAXP (java. sun. com/xml/jaxp/faq. html) Dom 4 j

Toolkits XML n Java n n JAXP (java. sun. com/xml/jaxp/faq. html) Dom 4 j (www. dom 4 j. org). NET (parte do. NET framework) XML Spy n www. xmlspy. com 56

XSL - e. Xtensible Stylesheet Language 57

XSL - e. Xtensible Stylesheet Language 57