Vuelvo a la carga con mis preguntas.
Al turrón: tengo que parsear un documento XML que no cumple ningún estándar de XML, tiene la extensión de xml pues porque tenían que ponerle una. Ciertamente se parece mucho a xml y usa las mismas jerarquías de estructuras, pero ni cumple DTD ni Schema. Esto descarta poder utilizar módulos de parseo de Perl, con lo que debo de hacerlo con expresiones regulares.
Vale, el fichero "xml" es algo tal que así (tiene aprox. 10.000 líneas de ese estilo):
Using xml Syntax Highlighting
<Service>
<Name>opc_adm (discovered)</Name>
<Label>opc_adm</Label>
<MsgWeight>1.0</MsgWeight>
<MsgPropRuleRef>Unchanged</MsgPropRuleRef>
<Icon>services.32.gif</Icon>
<CalcRuleRef>Most critical</CalcRuleRef>
<Source>
<Dependency/>
<ServiceRef>SVCDISC:System</ServiceRef>
<PropRuleRef>Unchanged</PropRuleRef>
<Weight>1.0</Weight>
</Source>
<Source>
<Dependency/>
<ServiceRef>SVCDISC:Applications</ServiceRef>
<PropRuleRef>Unchanged</PropRuleRef>
<Weight>1.0</Weight>
</Source>
<Source>
<Dependency/>
<ServiceRef>HP OpenView Operations</ServiceRef>
<PropRuleRef>Unchanged</PropRuleRef>
<Weight>1.0</Weight>
</Source>
<Source>
<Dependency/>
<ServiceRef>SGC</ServiceRef>
<PropRuleRef>Unchanged</PropRuleRef>
<Weight>1.0</Weight>
</Source>
</Service>
<Name>opc_adm (discovered)</Name>
<Label>opc_adm</Label>
<MsgWeight>1.0</MsgWeight>
<MsgPropRuleRef>Unchanged</MsgPropRuleRef>
<Icon>services.32.gif</Icon>
<CalcRuleRef>Most critical</CalcRuleRef>
<Source>
<Dependency/>
<ServiceRef>SVCDISC:System</ServiceRef>
<PropRuleRef>Unchanged</PropRuleRef>
<Weight>1.0</Weight>
</Source>
<Source>
<Dependency/>
<ServiceRef>SVCDISC:Applications</ServiceRef>
<PropRuleRef>Unchanged</PropRuleRef>
<Weight>1.0</Weight>
</Source>
<Source>
<Dependency/>
<ServiceRef>HP OpenView Operations</ServiceRef>
<PropRuleRef>Unchanged</PropRuleRef>
<Weight>1.0</Weight>
</Source>
<Source>
<Dependency/>
<ServiceRef>SGC</ServiceRef>
<PropRuleRef>Unchanged</PropRuleRef>
<Weight>1.0</Weight>
</Source>
</Service>
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Esto se lo enchufas a otra aplicación que se traga ese fichero y crea un árbol de jerarquías, etc. Bien, hasta ahí todo correcto.
He hecho este script que lo que hace es leerme el fichero, contar hasta 10000 e irme imprimiendo "en teoría" cada línea que lee del fichero xml, para ver, sencillamente que Perl lo lee y lo escribe como yo quiero. Este es el script:
Using perl Syntax Highlighting
#!/usr/local/bin/perl
use warnings;
use diagnostics
my $carpeta = "C:\\XMLparser\\";
my $fichero = "xml_mutilado_pruebas.xml";
my $rutacompleta = $carpeta . $fichero ;
my $dumpfile = "volcado.txt";
my $dumpall = $carpeta . $dumpfile;
my $contador = 0;
if (!(-e $dumpall)) {
open (DUMPFILEOUT, ">>$dumpall") or die "No se ha podido actualizar el fichero de Log (log_file.txt)\n";
close DUMPFILEOUT;
}
open (PARSEO, "<$rutacompleta");
open (DUMPFILEOUT, ">>$dumpall");
foreach $lector(<PARSEO>) {
while ($contador < 10000) {
printf DUMPFILEOUT "$lector ::: numero de iteracion: $contador\n";
$contador++;
#print "$contador\n";
}
}
close PARSEO;
close DUMPFILEOUT;
use warnings;
use diagnostics
my $carpeta = "C:\\XMLparser\\";
my $fichero = "xml_mutilado_pruebas.xml";
my $rutacompleta = $carpeta . $fichero ;
my $dumpfile = "volcado.txt";
my $dumpall = $carpeta . $dumpfile;
my $contador = 0;
if (!(-e $dumpall)) {
open (DUMPFILEOUT, ">>$dumpall") or die "No se ha podido actualizar el fichero de Log (log_file.txt)\n";
close DUMPFILEOUT;
}
open (PARSEO, "<$rutacompleta");
open (DUMPFILEOUT, ">>$dumpall");
foreach $lector(<PARSEO>) {
while ($contador < 10000) {
printf DUMPFILEOUT "$lector ::: numero de iteracion: $contador\n";
$contador++;
#print "$contador\n";
}
}
close PARSEO;
close DUMPFILEOUT;
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
Lo curioso es que me hace las 10.000 iteraciones y me abre el fichero que le indico que me escriba, y me escribe siempre en cada línea esto:
- Código: Seleccionar todo
<Service>
::: numero de iteracion: 0
<Service>
::: numero de iteracion: 1
<Service>
::: numero de iteracion: 2
<Service>
::: numero de iteracion: 3
<Service>
::: numero de iteracion: 4
<Service>
::: numero de iteracion: 5
<Service>
::: numero de iteracion: 6
<Service>
::: numero de iteracion: 7
<Service>
::: numero de iteracion: 8
<Service>
::: numero de iteracion: 9
<Service>
::: numero de iteracion: 10
<Service>
::: numero de iteracion: 11
<Service>
::: numero de iteracion: 12
Así hasta la 10.000, sinceramente no se qué está haciendo mal, porque el fichero de origen es el que os he puesto y aquí me da la impresión de que está constantemente leyendo la primera línea y contando 1, así hasta 10.000.
Como leí recientemente el bug es uno, no Perl, así que entiendo que estoy diciéndole algo mal, o simplemente no le estoy diciendo algo a Perl.
¿Alguna idea de que me puede estar fallando y/o faltando?
¡¡Un saludo y aprovecho para felicitaros la navidad!!