XML não é a resposta 2: parsing

Em meu último post sobre esse assunto, expliquei porque prefiro, na maioria dos casos, usar um formato de descrição de dados como JSON ao invés de XML. Infelizmente, parece que nem todo mundo concorda comigo, e há uma porção de dados úteis disponíveis apenas em XML. O que não é um problema, certo? Do que eu estou reclamando? Os dados estão lá, disponíveis publicamente, muitos de graça, e eu aqui reclamando do formato?

Vamos dar um jeito e ler XML!

A maneira óbvia parece ser usar um parser de XML, e é o que eu faço na maioria dos casos. Toda linguagem e ambiente de desenvolvimento hoje possuem bons parsers de XML para você escolher. Mas nem sempre o parser de XML é a melhor solução.

Vamos tomar como exemplo o retorno do rssWeather.com:

http://www.rssweather.com/wx/br/sao+paulo+aeropor-to/rss.php

A resposta é um RSS com uma tag content:encoded, contendo uma seção CDATA com um trecho de HTML. Você vai ter que fazer duplo parsing se quiser as informações de dentro desse HTML. Ou pode adotar uma solução assim:

import urllib2,re
url='http://www.rssweather.com/wx/br/sao+paulo+aeropor-to/rss.php'
xml=urllib2.urlopen(url).read()
data=dict(re.findall('<dt.*>(.*)</dt><dd.*> ?(.*)</dd>',
        xml.replace(':','').replace('&#176;','\xc2\xb0')))

Cinco linhas de código. Dê uma olhada no retorno disso:

>>> data
{'Barometer': '1028 mb', 'Wind Speed': '10 KMH', 'Dewpoint': '15\xc2\xb0C', 'Wind Direction': 'SSE (160\xc2\xb0)', 'Visibility': '6 km', 'Humidity': '93%', 'Wind Chill': '15\xc2\xb0C', 'Heat Index': '16\xc2\xb0C'}
>>> for i in data.iteritems(): print '%s => %s' % i
... 
Barometer => 1028 mb
Wind Speed => 10 KMH
Dewpoint => 15°C
Wind Direction => SSE (160°)
Visibility => 6 km
Humidity => 93%
Wind Chill => 15°C
Heat Index => 16°C

É importante entender os riscos que estamos assumindo ao adotar essa solução. Se o formato desse HTML for ligeiramente modificado, nosso código pode parar de funcionar. Neste caso, como os dados estão em HTML dentro do XML, isso não é uma desvantagem, porque você teria o mesmo tipo de problema usando um parser SGML.

Será que conseguimos a mesma simplicidade lendo HTML?

import urllib2
url='http://www.bancocentral.gov.br/'
html=urllib2.urlopen(url).read()
dados=html.replace(',','.').split('')[0].split('\r\n')[-7:]
dados=map(float,(dados[0].strip(),dados[3].strip()))

Veja o retorno:

>>> print 'Compra: %.4f, Venda: %.4f' % tuple(dados)
Compra: 1.7784, Venda: 1.7792

Publicado por

Elcio

Elcio é sócio fundador da Visie Padrões Web. Pioneiro no uso e divulgação dos padrões do W3C no Brasil, Elcio já treinou equipes de dezenas de empresas como Globo.com, Terra, Petrobras, iG e Locaweb. Além disso, tem dirigido as equipes da Visie no desenvolvimento de projetos web para marcas como Brastemp, Itaú Unibanco, Johnson & Johnson e Rede Globo.

7 comentários em “XML não é a resposta 2: parsing”

  1. Também não gosto de XML mas faço uso dele, sou fascinado pela Semantica e acredito veemente em uma internet muito melhor integrada de forma racional, tanto homem como máquina. Se quisermos alcançar isso, devemos seguir padrões. Não tem como ser diferente.

  2. Também acho o XML uma solução muito problemática na hora de distribuir dados. Acho que, para cada linguagem, existe uma forma correta de publicar as informações. No caso de PHP, gosto de usar “serialize / unserialize” simplesmente pela rapidez dele para fazer o parse na linguagem. Para Python e JavaScript prefiro JSON por “ene” motivos.

    Tive uma vez que fazer um parse de XML uma vez e usar “SimpleXML” foi mais difícil que usar explode e implode de string.

    Algumas vezes precisamos correr riscos e apostar em soluções mais rápidas para resolver o problema simplesmente para entregar o projeto ao cliente, ao invés de tentar achar uma solução tecnicamente correta.

  3. Quando eu preciso usar XML por alguma condição do cliente ou como nesses casos onde os dados estão disponíveis apenas em XML, dá pra facilitar bastante a vida usando XPath.

    Aliás, estou fazendo isso agora. 🙂

    A única vantagem que eu consigo ver no XML são os namespaces: No mesmo documento você pode ter uma fórmula em MathML, uma ilustração em SVG, um feed RSS, eventos de calendário, posições geográficas, etc…

    Pra APIs isso cai por terra, já que a informação é específica, mas para mineração de dados (como no exemplo da cotação) isso cairia como uma luva…
    O problema é achar algum site que se preocupe com isso.

    Um grande abraço!

  4. Elcio, concordo plenamente com você. nunca gostei de XML e me incomodava muito quando via que todos os TCCs da faculdade que eu estudava eram “Qualquer Coisa com XML”… tudo bem que dá para fazer, mas existem alternativas melhores.

    Outra coisa que usa XML e eu acho muito “tosca” é o SOAP. pqp… webservices REST com resposta em JSON são muito mais elegantes.

    []’s

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *