Apresentando o MicroXML, Parte 2: Processe MicroXML com o MicroLark

Faça experiências com o analisador pioneiro MicroXML

O MicroXML é uma simplificação do XML compatível com versões anteriores. parte 1 desta série abordou os princípios básicos do MicroXML. O MicroXML foi projetado com uma gramática objetiva que pode ser processada com muitas ferramentas de análise modernas e de uso geral. John Cowan desenvolveu o MicroLark, um analisador de MicroXML de software livre no ambiente™ Java. Neste artigo, você usará o código de exemplo para saber mais sobre o MicroLark.

Uche Ogbuji, Partner, Zepheira, LLC

Photo of Uche OgbujiUche Ogbuji é parceiro em Zepheira, LLC, uma empresa especializada em soluções da próxima geração de tecnologias da web. O Sr. Ogbuji é lead developer do 4Suite, uma plataforma de software livre para aplicativos XML, RDF e gerenciamento de conhecimento e seu sucessor Akara. Ele é Computer Engineer e escritor nascido na Nigéria, vive e trabalha em Boulder, Colorado, EUA. É possível encontrar mais informações sobre o Sr. Ogbuji no Weblog Copiaou no Twitter.



06/Ago/2012

Visão geral

O MicroXML — uma simplificação do XML compatível com versões anteriores — é uma especificação emergente. Na Parte 1 desta série, Explore os Princípios Básicos do MicroXML, você conheceu os fundamentos do MicroXML e viu em que ele é diferente do XML 1.x e das normas relacionadas. O MicroXML foi proposto por James Clark e aprimorado por John Cowan, que também criou o seu primeiro analisador, o MicroLark. O MicroLark é um software livre (licença Apache 2.0) escrito na linguagem Java que implementa vários modos de análise: modo pull, modo push e modo árvore.

Neste artigo, saiba como analisar o formato MicroXML. Explore os diversos aspectos da API do analisador MicroLark usando a linha de comando e o código de exemplo.

Introdução

Para acompanhar os exemplos neste artigo, será necessário fazer o download (consulte Recursos):

  • do microLark.jar ou do código fonte, se preferir
  • O software livre interpretador de Jython

É possível iniciar executando o MicroLark na linha de comando com um arquivo do MicroXML como entrada. A Listagem 1 é uma pequena modificação de um arquivo simples da parte 1.

Lista 1. Arquivo simples
<!DOCTYPE html>
<html lang="en">
  <!-- A comment -->
  <head>
    <title>Welcome page</title>
  </head>
  <body>
    <p>Welcome to <a href="http://ibm.com/developerworks/">IBM developerWorks</a>.</p>
  </body>
</html>

Salve a amostra acima como listing1.xml e alimente-a no MicroLark usando o código da Listagem 2.

Lista 2. MicroLark
java -jar microlark.jar listing1.xml

Você deve receber a saída exibida na Listagem 3.

Lista 3. Saída
(html
Alang en
-\n
-  
-\n
-  
(head
-\n
-    
(title
-Welcome page
)title
-\n
-  
)head
-\n
-  
(body
-\n
-    
(p
-Welcome to 
(a
Ahref http://ibm.com/developerworks/
-IBM developerWorks
)a
-.
)p
-\n
-  
)body
-\n
)html

Parece um pouco estranho? A Listagem 3 está em um formato chamado PYX — uma representação orientada a linhas de documentos XML — derivado, em última análise, de uma convenção para representar documentos SGML. O PYX renderiza todas as informações de um documento XML de uma forma que minimiza a carga de análise. É uma ferramenta extremamente útil que, infelizmente, não é valorizada pelos desenvolvedores de XML.

A operação padrão do MicroLark é converter um documento do MicroXML para o PYX — ou melhor, um subconjunto do PYX — com base no fato de que o MicroXML é um subconjunto do XML. (Para saber mais sobre o PYX, consulte "XML Matters: Intro to PYX" nos Recursos.)

O formato PYX é extremamente simples. O primeiro caractere de cada linha identifica o seu tipo de conteúdo. O conteúdo não transpõe diretamente as linhas, embora linhas sucessivas possam conter o mesmo tipo de conteúdo. No caso dos atributos de tags, o nome e o valor do atributo são separados simplesmente por um espaço, sem o uso de aspas extras. A Listagem 4 mostra os caracteres de prefixo.

Lista 4. Caracteres de prefixo
(  tag de início
)  tag de finalização
A  atributo
-  dados de caractere (conteúdo)
?  instrução de processamento

A legenda corresponde à entrada acima. A vantagem do PYX é que ele pode ser usado com o velho e infinitamente útil UNIX® comandos de processamento de texto como grep, awk, sort, sed, awk, etc.

Manipulação de erros

Como acontece com qualquer analisador de XML ou MicroXML, é importante entender o que acontece no caso de uma entrada errada. A Listagem 5 é um exemplo de XML mal formado da parte 1.

Lista 5. XML mal formado
<para>Olá, eu reivindico ser <strong>MicroXML</para>

Se o exemplo acima for salvo como badxml.xml e executado por meio do MicroLark, o resultado será a saída apresentada na A Listagem 6.

Lista 6. Manipulação de erros
$ java -jar microlark.jar badxml.xml
(para
-Hello, I claim to be 
(strong
-MicroXML
!1:50:Unexpected end-tag

O MicroLark começa a emitir as linhas de PYX e, em seguida, para de repente com uma mensagem de erro ao encontrar a tag incompatível. A saída especifica a linha e a coluna do arquivo de origem onde o erro ocorreu.


A API do analisador

A maioria dos usuários deseja conhecer melhor o analisador MicroLark. Para fazer isso sem se envolver demais com o código Java complicado, você usará o Jython, uma ferramenta de criação de protótipos excelente. O Jython é uma implementação da linguagem Python que gera código de byte Java e pode executá-lo. O Jython possibilita a interação com classes Java e APIs usando uma linguagem muito mais simples.

O analisador de push

Se você está familiarizado com o Simple API for XML (SAX), já conhece a interface de push. Para usar a interface de push do MicroLark, você fornece uma classe com métodos muito semelhantes ao SAX para manipular as várias construções, como elementos, atributos e dados de caractere. Utilize a interface ContentHandler para fornecer a classe. O MicroLark tem duas classes de utilitário com essa interface, inclusive a PyxWriter, que gera PYX como na Listagem 3.

A Listagem 7 é um programa simples em Jython para replicar a operação básica de linha de comando do MicroLark.

Lista 7. PYX
from org.ccil.cowan.microlark import PyxWriter, Parser
from java.lang import System

pw = PyxWriter(System.out)  
f = open(System.in)
p = Parser()     
p.parse(f, pw)

Salve a saída acima como listing4.py e chame-a como mostra a Listagem 8.

Lista 8. Amostra de chamada
jython -Dpython.path=microlark.jar listing3.py < listing1.xml

Um manipulador de conteúdos especializado

Normalmente, convém fornecer a sua própria classe de manipulador de conteúdos que faz algo mais especializado. A Listagem 9 define uma classe link_finder que verifica cada elemento para ver se é um elemento a (um link no estilo HTML). Em seguida, o manipulador de conteúdos imprime o valor do atributo href .

Lista 9. Manipulador especializado
from org.ccil.cowan.microlark import ContentHandler, Parser

class link_finder(ContentHandler):
    def startElement(self, elem):
        if elem.getName() == u'a':
            print elem.getAttributeValue(u'href')

f = open('listing1.xml')
p = Parser()     
p.parse(f, link_finder())

Se você executar o código da Listagem 9 , localizará o único link do documento, para http://ibm.com/developerworks/.

O analisador pull

Outra abordagem à análise é o método pull, no qual você solicita partes do documento de cada vez e usa métodos de utilitário para trabalhar com os eventos resultantes, que representam tags de elemento ou conteúdo. A Listagem 10 usa a API de pull para processar um arquivo de forma muito semelhante à versão em push da Listagem 7.

Lista 10. API de pull
from org.ccil.cowan.microlark import Parser

f = open('listing1.xml')
p = Parser()

#Start the pull parse
p.parse(f)

event = None

#Run through all the events in the document
while event != p.END_DOCUMENT:
    #Pull the next event
    event = p.next()
    #Is it an element start tag?
    if event == p.START_ELEMENT:
        #Get the element's information
        elem = p.getElement()
        #Is it an a element?
        if elem.getName() == u'a':
            #Then print the link value
            print elem.getAttributeValue(u'href')

A listagem tem muitos comentários para explicar a lógica a você. A saída é a mesma da Listagem 7.

O construtor em árvore

Também é possível usar o MicroLark para desenvolver uma árvore semelhante à do Modelo de Objeto de Documento (DOM). Para fazer isso, use o método buildTree() em um objeto Parser .


Demonstração

A parte 1 explicou como o MicroXML mantém o conhecimento dos espaços de nomes de XML e, ao mesmo tempo, simplifica as coisas na medida do possível. O MicroLark acompanha o espaço de nomes associado a qualquer elemento ou atributo, que pode ser acessado com os métodos getNamespace e getAttributeNamespace . Não há perda de tempo com prefixos e qnames. A Listagem 11 é um programa simples para analisar um arquivo e sinalizar sempre que um novo espaço de nomes padrão for encontrado.

Lista 11. Encontrando espaços de nomes padrão
from org.ccil.cowan.microlark import Parser
from java.lang import System

p = Parser()

#Start the pull parse
p.parse(System.in)

event = None
current_namespace = None

#Run through all the events in the document
while event != p.END_DOCUMENT:
    #Pull the next event
    event = p.next()
    #Is it an element start tag?
    if event == p.START_ELEMENT:
        #Get the element's information
        elem = p.getElement()
        #Has the namespace changed?
        if elem.getNamespace() != current_namespace:
            current_namespace = elem.getNamespace()
            #Print the new namespace
            print "Entering default namespace: ", current_namespace

A Listagem 12 é uma amostra de documento Atom no formato MicroXML. O espaço de nomes padrão é configurado para o Atom no elemento feed e para o XHTML no elemento div .

Lista 12. Amostra de documento Atom
<feed xmlns="http://www.w3.org/2005/Atom"
      xml:lang="en"
      xml:base="http://copia.ogbuji.net">
  <id>http://copia.ogbuji.net/atom1.0</id>
  <title>Copia</title>
  <updated>2005-07-15T12:00:00Z</updated>
  <author>
    <name>Uche Ogbuji</name>
    <uri>http://uche.ogbuji.net</uri>
  </author>
  <link href="/blog" />
  <link rel="self" href="/blog/atom1.0" />
  <entry>
    <id>http://copia.ogbuji.net/blog/2005-09-16/xhtml</id>
    <title>XHTML tutorial pubbed</title>
    <link href="http://copia.posterous.com/xhtml-tutorial-pubbed"/>
    <category term="xml"/>
    <category term="css"/>
    <category term="xhtml"/>
    <updated>2005-07-15T12:00:00Z</updated>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://www.ibm.com/developerworks/edu/x-dw-x-xhtml-i.htm">
            "XHTML, step-by-step"
          </a>
        </p>
        <blockquote>
          <p>Comece a trabalhar com Linguagem de Marcação de Hipertexto. Neste tutorial,
          o autor Uche Ogbuji mostra como usar XHTML em websites práticos.</p>
        </blockquote>
        <p>Neste tutorial</p>
        <ul>
          <li>Introdução do tutorial</li>
          <li>Anatomia de uma página da web XHTML</li>
          <li>Entender as regras básicas</li>
          <li>Substituir idiomas de HTML comuns</li>
          <li>Algumas considerações práticas</li>
          <li>Entre aspas</li>
        </ul>
      </div>
    </content>
  </entry>
</feed>

Salve o arquivo da Listagem 11 como listing7.py e o arquivo da Listagem 12 como listing8.xml. Execute os dois com o Jython. Você deve obter a saída mostrada na Listagem 13.

Lista 13. Saída
>$ jython -Dpython.path=microlark.jar listing7.py < listing8.xml 
Entering default namespace:  http://www.w3.org/2005/Atom
Entering default namespace:  http://www.w3.org/1999/xhtml

Conclusão

Uma especificação não tem muita importância sem uma implementação prática. A implementação do MicroXML foi um fato importante. John Cowan abriu o caminho com o MicroLark. Em geral, foi fácil entender o MicroLark, principalmente dentro da estrutura leve do Jython. Espero que agora você tenha o que é necessário para começar a fazer experiências com o MicroXML.

Recursos

Aprender

Obter produtos e tecnologias

Discutir

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Software livre
ArticleID=828969
ArticleTitle=Apresentando o MicroXML, Parte 2: Processe MicroXML com o MicroLark
publish-date=08062012