1 xml api: dom e sax prof. dr. cláudio baptista baptista@dsc.ufcg.edu.br

Post on 07-Apr-2016

217 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

TRANSCRIPT

1

XML API: DOM e SAX

Prof. Dr. Cláudio Baptistabaptista@dsc.ufcg.edu.br

http://www.lsi.dsc.ufcg.edu.br

2

Processamento de docs XML Um arquivo XML é um arquivo de

texto 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

3

Parser XML O parser tem a função de verificar

se um doc XML está sintaticamente correto; ou bem-formado

O parser deve parar o processamento caso o documento não esteja bem-formado (uma exceção é lançada)

4

Parser XML 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

5

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

SAX (Simple API to XML): baseada em eventos

DOM (Document Object Model): objetos/árvore

JDOM (Java Documet Object Model): Objetos/árvores

6

Processadores XML 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

7

DOM W3C 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.)

www.w3.org/DOM/ java.sun.com/webservices/docs/1.0/

tutorial/doc/JAXPDOM.html

9

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

10

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

11

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>

12

Exemplo (cont)

13

DOMParser DOMParser estende XMLParser Métodos importantes

void parse(InputSource source) Executa o parsing em source

void parse(java.lang.String systemId) Executa o parsing sobre o arquivo

identificado por systemId Document getDocument()

Retorna o documento

14

Interface Node Corresponde a um nó na árvore DOM Node pode ser usado para referenciar:

Elementos Atributos Texto Comentários Seções CDATA Entidades Documentos inteiros PI

15

Tipos básicos de nodes Document Element Attribute Text

16

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

17

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.

18

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.

19

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.

20

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..

21

Navegação de um Node

22

Manipulação de um Node

23

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.

24

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

25

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.

26

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."); } }}

27

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());}

}

28

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."); }}

29

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()); }}}...

30

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); }}

31

Resultado:

32

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); }}

33

Manipulando Atributos

34

Edição de documentos XML Existem métodos para

adicionar nodes, remover nodes, mudar valores de nodes

Consulte a API!

35

SAX 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 W3C) Usa um modelo baseado em eventos

Notificações (eventos) ocorrem à medida em que o documento é analizado (“parsed”)

36

SAX-based Parsers

SAX-based parsersDisponíveis 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.

37

Eventos

SAX parserInvoca certos métodos quando eventos ocorrem

Programadores devem fazer overriding destes métodos para processar os dados

38

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.

39

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)

40

Como SAX funciona?Processamento em SAX envolve 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.

41

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>

42

Criando um event handlerimport 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");}

}

43

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); }}

}

44

Associando o event handler ao parser

...xmlReader = saxParser.getXMLReader();xmlReader.setContentHandler(new SurveyReader());} catch (Exception e) {...

45

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 ...

46

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[]) { ...

47

Associando o ErrorHandler

...xmlReader.setContentHandler(new SurveyReader());xmlReader.setErrorHandler(new SurveyReader());InputSource source = new InputSource("surveys.xml");...

48

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[]) {...

49

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[]) { …}

50

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)); }}...

51

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));

}}...

52

Obtendo Dados: characters()

53

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)); }}...

54

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) é encontradaMaior performance do que DOMMenos overhead de memória do que DOMTipicamente usado para ler documentos (não para modificá-los)

55

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

baseada em DOM Vantagens:

As mesmas de DOM Interface OO muito mais rica que DOM

Desvantagens Mesmas do DOM Limitado à Java

57

XSL - eXtensible Stylesheet Language

top related