XML em Perl, parte 1

Começando bem do princípio que é para ninguém se perder no meio do caminho. De acordo com a Wikipedia, XML é “uma recomendação da W3C para gerar linguagens de marcação para necessidades especiais”.

Então, lembra a diferença entre dado e informação?

Em um arquivo XML inserimos tanto os dados como também descrevermos a “qualidade” deles. Por exemplo, uma agenda telefônica armazenada em arquivo CSV seria algo assim:

"Fulano";"1234-5678"
"Sicrano";"8765-4321"

Ele (o arquivo) contém somente os dados soltos, a informação sobre o que significa cada item deverá (assim espero) estar dentro do programa. Enquanto que o mesmo em XML seria:

<agenda>
 <entry>
  <name>Fulano</name>
  <phone>1234-5678</phone>
 </entry>
 <entry>
  <name>Sicrano</name>
  <phone>8765-4321</phone>
 </entry>
</agenda>

No XML fica um pouco maior pois além dos dados estão inseridas etiquetas (tags) que explicam o que é cada um e assim não preciso ter acesso ao programa original para saber o que fazer com eles. E este é um dos principais usos do XML, a troca de informações entre aplicações de maneira independente da arquitetura, plataforma, sistema operacional ou linguagem de programação utilizados.

Se bem que aqui mostrarei como fazer em Perl.

Trabalhando com XML

Como arquivos XML são apenas texto, você pode adaptar seu programa para inserir algumas tags e pronto, suporte incluído para geração de arquivos! Basta fazer algo como este aqui, o fabuloso “XeMeLizer”:

#!/usr/bin/perl
use strict;
use warnings;

my ( $content, $filename, $filesize, $fh, $line );

$filename=$ARGV[0];

if ( -f $filename )
{
    open(my $fh, '<', $filename)
    or die "Impossível abrir o arquivo '$filename' $!";
    
    binmode $fh,":raw";
    $filesize=-s $filename;
    read $fh,$content,$filesize;
    close $fh;
    
    my @xml=split(/\n/,$content);
    
    print "<?xml version='1.0'?>\n<file>\n";
    
    foreach $line (@xml)
    {
        $line=~ s/\"/\\\"/g;
        print "\t<line>".chr(34).$line.chr(34)."</line>\n";
    }
    
    print "</file>\n";
}

exit 0;

Apesar do tom de brincadeira já vi uma aplicação comercial justamente fazer isto aqui quando selecionada a opção “Exportação para XML…”.

Mas voltando a falar sério. E para a leitura? Usando a mesma abordagem você precisa escrever um programa que procure pelos delimitadores das tags (os “<” e “>”) e… Complicou, né? É bem mais prático e fácil recorrer a alguma extensão da linguagem, no caso do Perl há várias disponíveis mas eu usarei a XML::Simple. Motivo? Nenhum em especial, apenas achei mais simples de trabalhar.

Instalando o XML::Simple

Como (quase) todo módulo do Perl ele está disponível pelo repositório oficial de módulos do Perl, o CPAN, e a própria instalação da linguagem já inclui uma ferramenta, a cpan, que se encarrega de baixar, compilar e instalar corretamente módulos e suas eventuais dependências, mas antes de sair compilando coisas por aí, convém verificar se já não está disponível no seu sistema operacional/distribuição.

Usuários do FreeBSD podem ir direto para a parte do CPAN se desejarem (eu já verifiquei que não tem no Ports).

Linux

Nas distribuições baseadas em Debian (e, por enquanto, Ubuntu) utilize:

$ sudo apt-get install libxml-simple-perl

E nas baseadas em Red Hat (RHEL, CentOS, Fedora etc) use:

$ sudo yum install perl-XML-Simple

Nas demais, pesquise com a ferramenta de empacotamento por “perl xml simple” e se não tiver sucesso, recorra ao CPAN (veja abaixo).

(Mac)OS X

Acontece que o OS X já tem Perl instalado por padrão (ao menos tinha na última vez) então use o CPAN, mas se você é usuário do MacPorts utilize:

$ sudo p5-xml-simple

Explicação — quem usa o MacPorts pode ter duas instalações de Perl no sistema; a original da Apple (em “/usr/bin”) e uma outra, mais recente, instalada pelo MacPorts (geralmente em “/opt/local/bin”).

Windows

Eu conheço ao menos duas  maneiras de instalar Perl sob Windows, a primeira é por debaixo do Cygwin (onde é o mesmo Perl dos UNIXes acessando o sistema operacional a partir da CYGWIN.DLL) e a outra é com o Strawberry Perl (onde ele roda como um binário nativo do sistema operacional).

Para quem se encontra no primeiro caso execute novamente o instalador do Cygwin (o SETUP-X86.EXE), vá até a lista de software, pesquise por “xml simple” e instale o pacote “perl-XML-Simple”. Mas se for frequentador assíduo daqui apenas digite:

$ apt-cyg install perl-XML-Simple

No caso do Strawberry Perl, não tem jeito, vá de CPAN.

Baixando direto da CPAN

Se tudo mais falhou na tentativa de se obter um módulo pronto para seu sistema operacional, o jeito é recorrer à ferramenta de instalação do CPAN e compilá-lo, sendo assim digite:

$ sudo cpan GRANTM/XML-Simple-2.20.tar.gz

No caso do Stawberry Perl, abra o console do Per, ele está em: Iniciar→Programas→Stawberry Perl→Perl (command line) e aí digite:

C:\ ... >cpan GRANTM/XML-Simple-2.20.tar.gz

Mas se você não tiver direitos no administrativos neste usuário, logue com um que tenha ou use o RUNAS.EXE.

Daí é acompanhar as mensagens passando pela tela e se tudo correr bem aparecerá algo assim no final:

(...)
Result: PASS
  GRANTM/XML-Simple-2.20.tar.gz
  /usr/bin/make test -- OK
Running make install
Installing /usr/local/lib/perl5/site_perl/XML/Simple.pm
Installing /usr/local/lib/perl5/site_perl/XML/Simple/FAQ.pod
Installing /usr/local/lib/perl5/site_perl/man/man3/XML::Simple.3
Installing /usr/local/lib/perl5/site_perl/man/man3/XML::Simple::FAQ.3
Appending installation info to /usr/local/lib/perl5/5.18/mach/perllocal.pod
  GRANTM/XML-Simple-2.20.tar.gz
  /usr/bin/make install  -- OK

Mas no caso do Strawberry Perl os caminhos serão diferentes:

(...)
Result: PASS
  GRANTM/XML-Simple-2.20.tar.gz
  C:\STRAWB~1\c\bin\dmake.exe test -- OK
Running make install
Installing C:\STRAWB~1\perl\site\lib\XML\Simple.pm
Installing C:\STRAWB~1\perl\site\lib\XML\Simple\FAQ.pod
Appending installation info to C:\STRAWB~1\perl\lib/perllocal.pod
  GRANTM/XML-Simple-2.20.tar.gz
  C:\STRAWB~1\c\bin\dmake.exe install UNINST=1 -- OK

Testando a instalação

Pegue o arquivo XML de exemplo, salve-o como agenda.xml, e crie este sujeito aqui com o nome de agenda1.pl:

#!/usr/bin/perl
use XML::Simple;
my $xml=new XML::Simple;
my $data=$xml->XMLin("agenda.xml");
print $data->{entry}{Fulano}{phone}."\n";
exit 0;

Execute e o resultado deverá ser este daqui:

$ perl agenda.pl
1234-5678

Parabéns, o XML-Simple está instalado e funcionando! E na próxima parte explicarei a “sopa de letrinhas” acima.

Anúncios

Um comentário sobre “XML em Perl, parte 1

  1. Pingback: XML em Perl, parte 2 | giovannireisnunes

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s