• Nenhum resultado encontrado

SAX Neste capítulo é mostrado um estudo sobre a interface de programa de aplicação baseada

em eventos, SAX. São descritas suas características, funcionalidade, bem como as interfac es e métodos que compõem esta API.

SAX

61

5.1 Introdução

Simple API for XML ou SAX nasceu na lista de discussão XML-DEV [Megginson 2001]. Muitos desenvolvedores de aplicações XML sofriam com a incompatibilidade dos analisadores dessa linguagem. Com o objetivo de tornar compatíveis os diferentes analisadores XML, os membros desta lista começaram em dezembro de 1997 a discussão sobre a criação de um parser. Com a ajuda de vários colaboradores, David Megginson liberou em 11 de maio de 1998 a primeira versão de SAX [Megginson 2001].

SAX é uma API de domínio público, não pertence a qualquer consórcio ou agência de padrões, nem a qualquer empresa ou indivíduo [Megginson 2001]. Entretanto, é um padrão bastante usado.

Inicialmente, ela foi desenvolvida em Java. Hoje, é possível encontrar parsers SAX escrito em várias linguagens de programação, entre elas C++, Visual Basic, Python e, Perl [Harold 2002].

5.2 Interface Baseada em Eventos

SAX é uma interface orientada a eventos e, como tal, funciona de forma bem diferente de uma interface baseada em objetos. Um parser baseado em eventos diz à aplicação o que está no documento ao notificar a aplicação de um fluxo de eventos analisados [Martin 2000]. Isto é, o parser baseado em eventos lê um documento e diz à aplicação quais os símbolos que ele encontra, à medida que os símbolos são encontrados. Por exemplo, ele notifica a aplicação que encontrou uma tag inicial, um dado de caracter, uma tag de fim, e assim por diante.

Considere o seguinte arquivo XML:

<? xml version= “1.0” encoding=”UTF-8”?> <produtos> <produto tipo=”livro”> XML </produto> </produtos>

Um parser SAX ao processar este documento dispara os seguintes eventos: startDocument()

SAX startElement (“produto”) characters (“XML”) endElement (“produto”) endElement (“produtos”) endDocument ()

Quando o parser XML processa este documento ele gera uma seqüência de eventos para tudo que ele reconhece no documento. Primeiro ele dispara o evento que indica o início do documento (startDocument). Ao ler a tag <produtos>, o parser gera um segundo evento, que notifica que o elemento produtos está começando (startElement). Depois ele encontra a tag de abertura <produto> e gera um novo evento para início de elemento. Em seguida ele encontra o conteúdo do elemento <produto> (XML) e dispara o evento correspondente a dados de caracteres (characters). Quando encontra a tag de fechamento </produto>, o parser dispara o evento de fim de elemento (endElement). Para a tag </produtos> ele também gera um evento que indica o fim deste elemento e depois gera o último evento de fim de documento (endDocument). A Figura 5.1 ilustra este processo.

Figura 5.1 – Eventos gerados por um parser SAX a medida que ler o documento XML

5.3 SAX e SAX 2

Depois de sua criação em 1998, SAX sofreu algumas alterações. No final de 1999, uma reformulação de SAX começou a ser feita e, em maio de 2000, a versão 2.0 de SAX estava completa. Essa nova versão mantém a mesma arquitetura orientada a eventos, mas substitui várias classes de SAX1, além de criar novas classes. A principal mudança da versão 1.0

start

Document Element start characters Element end Document end

Parser

<produtos> <produto> XML </produto> </produtos>

start

SAX

63 para a versão 2.0 foi tornar SAX2 sensível a namespace, além de acrescentar filtros e suporte a eventos léxicos e DTDs [Megginson 2001].

As interfaces AttibuteList, AttributeListImpl, DocumentHandler, HandlerBase e Parser definidas em SAX1 foram substituídas na versão 2, respectivamente, pelas interfaces: Attibutes, AttributesImpl, ContentHandler, DefaultHandler e XMLReader. Além destas, SAX2 define sete novas interfaces, são elas: XMLFilter, NamespaceSupport, XMLFilterImpl, ParserAdapter, SAXNotSupportedException, SAXNotRecognizedException e XMLReaderAdapter.

A versão mais atual de SAX é a 2.0.1 [Megginson 2001], que não traz mudanças radicais com relação a SAX 2.0, apenas acrescenta alguns bits de informação do documento XML que não são expostos por SAX2, tal como a declaração de codificação. Entretanto, nenhuma classe, interface, ou método de SAX2 são desprezados em SAX 2.0.1.

5.4 As Interfaces SAX

SAX foi projetado em torno de interfaces. As interfaces básicas de SAX2 são XMLReader e ContentHandler. A primeira representa o parser, e ContentHandler é a interface que trata eventos produzidos pelo parser. Através desta interface, o parser notifica a aplicação o que está lendo no documento XML.

Em SAX, o parser é uma instância da interface XMLReader, a classe específica que implementa esta interface varia para cada parser. Depois de criar o parser, os objetos InputSource, que contêm o documento XML, são passados para o método parse() de XMLReader. O parser lê o documento e, caso detecte algum erro de formação, ele gera uma exceção definida na interface SAXException.

À medida que o parser lê o documento ele invoca métodos da interface ContentHandler para os itens encontrados. Por exemplo, quando o parser lê uma tag de abertura, ele chama o método startElement(); quando lê um conteúdo de texto o método invocado é characters(). Se o parser encontra uma tag de fechamento, ele invoca o método endElement(), e assim por diante, até chegar ao fim do arquivo XML e invocar o método endDocument().

SAX

5.5 A Interface XMLReader

SAX representa o parser como uma instância da interface XMLReader. Como interface, ela não possui construtor. Para criar uma instância de XMLReader é usado um dos métodos createXMLReader() da classe XMLReaderFactory:

public static XMLReader createXMLReader() throws SAXException;

public static XMLReader createXMLReader(String className) throws SAXException;

O primeiro método retorna a implementação default de XMLReader. Os desenvolvedores de parser modificam este método para retornar o seu próprio parser. No segundo método é possível especificar a classe do desenvolvedor que implementa XMLReader. Esta classe varia para cada desenvolvedor. Por exemplo, no parser Xerces e XML for Java a classe é org.apache.xerces.parsers.SAXParser [Xerces 2002], em Aelfred a classe é gnu.xml.aelfred2.XmlReader [GNU 2001], em Crimson a classe é org.apache.crimson.parser.XMLReaderImpl [Crimson 2001], enquanto que no parser da Oracle XMLReader é implementada pela classe oracle.xml.parser.v2.SAXParser [Oracle 2002].