2012-05-01 26 views
8

Creo que este es un problema muy simple, pero no puedo resolverlo a pesar de muchas búsquedas.Script Perl para analizar XML utilizando XML :: LibXML;

Estoy tratando de analizar el siguiente XML para imprimir algo similar a TAG = VALUE, para que pueda escribir esto en un archivo CSV. El problema es que las etiquetas no son siempre las mismas para cada muestra. Parece que no puedo entender cómo obtener los nombres reales de las etiquetas. Cualquier ayuda apreciada !!!

de archivo XML -

<Statistics> 
    <Stats> 
    <Sample> 
     <Name>System1</Name> 
     <Type>IBM</Type> 
     <Memory>2GB</Memory> 
     <StartTime>2012-04-26T14:30:01Z</StartTime> 
     <EndTime>2012-04-26T14:45:01Z</EndTime> 
    </Sample> 

    <Sample> 
     <Name>System2</Name> 
     <Type>Intel</Type> 
     <Disks>2</Disks> 
     <StartTime>2012-04-26T15:30:01Z</StartTime> 
     <EndTime>2012-04-26T15:45:01Z</EndTime> 
     <Video>1</Video> 
    </Sample> 
    </Stats> 
</Statistics> 

Guión -

#!/usr/bin/perl 
use XML::LibXML; 

$filename = "data.xml"; 

my $parser = XML::LibXML->new(); 
my $xmldoc = $parser->parse_file($filename); 

for my $sample ($xmldoc->findnodes('/Statistics/Stats/Sample')) { 

print $sample->nodeName(), ": ", $sample->textContent(), "\n"; 

} 

Respuesta

16

Has el método adecuado para obtener los nombres de las etiquetas, sólo tiene un bucle extra para correr a través de las etiquetas dentro de cada <sample>:

#!/usr/bin/perl 

use strict; 
use warnings; 

use XML::LibXML; 

my $filename = "data.xml"; 

my $parser = XML::LibXML->new(); 
my $xmldoc = $parser->parse_file($filename); 

for my $sample ($xmldoc->findnodes('/Statistics/Stats/Sample')) { 
    for my $property ($sample->findnodes('./*')) { 
     print $property->nodeName(), ": ", $property->textContent(), "\n"; 
    } 
    print "\n"; 
} 

Editar: Tengo ahora creó un sitio tutorial llamado Perl XML::LibXML by Example que responde exactamente este tipo de pregunta.

5

Es necesario iterar sobre los hijos del nodo muestra,

for my $sample ($xmldoc->findnodes('/Statistics/Stats/Sample')) { 
    print $sample->nodeName(), "\n"; 
    foreach my $child ($sample->getChildnodes) { 
     if ($child->nodeType() == XML_ELEMENT_NODE) { 
      print "\t", $child->nodeName(), ":", $child->textContent(), "\n"; 
     } 
    } 
} 

mostrará,

Sample 
     Name:System1 
     Type:IBM 
     Memory:2GB 
     StartTime:2012-04-26T14:30:01Z 
     EndTime:2012-04-26T14:45:01Z 
Sample 
     Name:System2 
     Type:Intel 
     Disks:2 
     StartTime:2012-04-26T15:30:01Z 
     EndTime:2012-04-26T15:45:01Z 
     Video:1 
+2

Línea 3 + 4 + 6 puede ser sustituido con: 'foreach mi $ hijo ($ muestra -> findnodes ('*')) {' – ikegami

+0

¡¡¡¡¡¡¡¡¡¡¡Gracias !! – lozwell

Cuestiones relacionadas