[Cascavel-pm] XML parsing
Alceu R. de Freitas Jr.
glasswalk3r em yahoo.com.br
Terça Setembro 16 14:27:59 CDT 2003
--- Nelson Ferraz <nferraz em phperl.com> escreveu: > >
>
> Os módulos XML::* são úteis quando você precisa
> extrair informações de
> um arquivo XML, mas se o objetivo for apenas
> dividi-lo em partes
> menores, talvez o jeito mais fácil ainda seja usar
> um simples loop...
Talvez sim, talvez não. Para o caso específico que
citei, talvez um script "normal" resolva melhor, o
fato é que esses arquivos XML vão começar a fazer
parte da minha rotina diária... daí meu pedido de
indicações.
> Você pode mandar um trecho do arquivo e a saída que
> você espera?
Eu coloquei apenas a parte que interessa do script, as
inicializações eu deixei de fora:
open (FILE,"<$path") || die "Cannot read $file: $!\n";
while (<FILE>) {
next if $_ eq '';
# get the footer
if (/<\?xml version="1.0"
encoding="ISO-8859-1"\?>/io) {
chomp;
s/\r$//o;
$xml_header = $_;
next;
}
if (/<Siebel/io) {
chomp;
s/\r$//o;
$siebel_start = $_;
my @temp_list = split(/ /,$_);
$temp_list[0] =~ s/\<//o;
$siebel_end = "</$temp_list[0]>";
next;
}
# get the third line anyway (list of something)
if ( (defined($siebel_start)) and
(!defined($start_list)) ) {
chomp;
s/\r$//o;
$start_list = $_;
$end_list = $start_list;
$end_list =~ s/<//o;
$end_list =~ s/>//o;
$end_list =~ s/\s+//g;
$end_list = " </$end_list>";
next;
}
# count for account; when reaches limit, put data into
another file
if (/^\s{4}<Account>/io) {
$account_counter++;
$start_copy = 1;
}
if ($start_copy == 1) {
chomp;
s/\r$//o;
next if (/<\/ListOfAccount>/io);
next if (/<\/SiebelMessage>/io);
push (@contents,$_) unless (/<\/Account>/io);
}
if (/<\/Account>/) {
$| = 1;
chomp;
s/\r$//o;
push (@contents,$_);
# reaches limits, create a file and put data into it
if ($account_counter == $limit) {
# file must have at least XML initial tag
die "This file is not in XML format\n" unless
defined($xml_header);
$file_counter++;
print "Creating $file-$file_counter.xml...\t";
create_part();
print "---> OK.\n";
$account_counter = 0;
}
}
next;
}
close(FILE);
# let´s create the last final, with the rest of the
content
$file_counter++;
print "Creating last file $file-$file_counter.xml...
";
create_part();
print "---> OK.\n";
A função create_part pega uma coleção de registros
(não adianta eu trabalhar por linhas nesse caso) e
cria um arquivo separado. O programa faz isso até o
arquivo original tiver sido lido completamente.
Le Champs, vc vai reparar meus "/io" espalhados por
aí. E, para não perder o embalo, lanço a pergunta: até
que ponto vale a pena matar a legibilidade do programa
em não usar esses operadores?
[]´s
=====
Alceu Rodrigues de Freitas Junior
--------------------------------------
glasswalk3r em yahoo.com.br
http://www.imortais.cjb.net
-----------------------------------------------------------------------
"You have enemies? Good. That means you've stood up for something, sometime in your life." - Sir Winston Churchill
_______________________________________________________________________
Desafio AntiZona: participe do jogo de perguntas e respostas que vai
dar um Renault Clio, computadores, câmeras digitais, videogames e muito
mais! www.cade.com.br/antizona
Mais detalhes sobre a lista de discussão Cascavel-pm