[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