Jump to content
Fórum Script Brasil
  • 0

XML


churros5

Question

Fala galera,

Bom, é o seguinte. Sou iniciante em perl e gostaria muito de resolver um problema que tem me tirado boas noites de sono. Envolve mais lógica do que a linguagem em si. É o seguinte:

Digamos que eu tenha uma estrutura parecida com um XML da seguinte forma:

<funcao>

<nome>Funcao1</nome> <repeticaofilhos> 3 </repeticaofilhos>

<funcao>

<nome>Funcao3</nome> <repeticaofilhos> 5 </repeticaofilhos>

</funcao>

<funcao>

<nome>Funcao4</nome> <repeticaofilhos> 2 </repeticaofilhos>

</funcao>

</funcao>

<funcao>

<nome>Funcao2</nome> <repeticaofilhos> 2 </repeticaofilhos>

</funcao>

Este exemplo acima, é um tipo de estrutura que pretendo trabalhar no perl.

Repare que as funções 3 e 4 estão dentro da função 1. São filhas da função 1. O meu objetivo é pegar esta estrutura parecida com um XML, e quebrar a árvore e seus nós em algo parecido com isso:

Funcao1

Funcao3

Fimfuncao3

Funcao3

Fimfuncao3

Funcao3

Fimfuncao3

Funcao4

Fimfuncao4

Funcao4

Fimfuncao4

Funcao4

Fimfuncao4

Fimfuncao1

Funcao2

Fimfuncao2

As Funções 3 e 4 aparecem 3 vezes, porque a tag <repeticoesfilho> da funcão 1, que é o nó pai, tem seu valor 3. A função 2 por sua vez, não tem filhos. Mas se tivesse, estes seriam chamados 2 vezes, por causa do valor da tag <repeticoesfilho> da função 2.

Entenderam? Sei que perl é super poderoso, e que em programação tudo é possível, mas não tenho encontrado solução para este problema. Espero que alguém possa me ajudar.

Obrigado!

Link to comment
Share on other sites

2 answers to this question

Recommended Posts

  • 0

Olá, se isso for um XML, use o XML::Simple que ele cuidará de transformar isso numa estrutura Perl.

http://search.cpan.org/~grantm/XML-Simple-...b/XML/Simple.pm

#!/usr/bin/perl

use strict;
use warnings;

use XML::Simple;
use Data::Dumper;
my $xs = XML::Simple->new;
my $ref = $xs->XMLin('meuxml.xml');
print Dumper $ref;

Depois de transformado numa estrutura Perl, você verá que como mágica o seu problema será resolvido.

Link to comment
Share on other sites

  • 0

Tem também o módulo XML::XPath. Imagine o seguinte XML:

<Biblioteca>
    <Livro ISBN="1234567" Ano="2000">
        <Paginas>300</Paginas>
        <Titulo>A arte de programar em meia-hora</Titulo>
        <Exemplares>
            <Codigo>1</Codigo>
            <Codigo>2</Codigo>
        </Exemplares>
    </Livro>
    <Livro ISBN="7654321" Ano="1710">
        <Paginas>500</Paginas>
        <Titulo>Aprenda a usar o ábaco em 21 dias</Titulo>
        <Exemplares>
            <Codigo>10</Codigo>
            <Codigo>20</Codigo>
            <Codigo>30</Codigo>
            <Codigo>40</Codigo>
        </Exemplares>
    </Livro>
</Biblioteca>
Ele seria facilmente lido com o módulo XPath da seguinte forma:
#!/usr/bin/perl

use XML::XPath;

my $inputFile = shift;

die("Faltou passar o nome do arquivo!") unless defined($inputFile);

my $xpath = XML:: XPath->new(filename => $inputFile);
my $nodeset = $xpath->find('//Biblioteca/Livro');

foreach my $context ($nodeset->get_nodelist) {
    my $isbn = $xpath->findvalue('@ISBN', $context);
    print "ISBN: $isbn\n";
    my $ano = $xpath->findvalue('@Ano', $context);
    print "Ano de Publicação: $ano\n";
    my $paginas = $xpath->findvalue('Paginas', $context);
    print "Quantidade de Páginas: $paginas\n";
    my $titulo = $xpath->findvalue('Titulo', $context);
    print "Título: $titulo\n";
    my $exemplares = $xpath->find('Exemplares/Codigo', $context);
    print "Exemplares disponíveis:\n";
    foreach my $newcontext ($exemplares->get_nodelist){
        my $codigo = $xpath->findvalue('.', $newcontext);
        print "\tCódigo: $codigo\n";
    }
}

Exemplo e código retirado de: http://perlbrasil.blogspot.com/2011/03/len...-com-xpath.html

Abraços.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.1k
    • Total Posts
      651.9k
×
×
  • Create New...