2009-08-03 7 views
0

J'ai le fichier XML suivant généré par mon serveur HP iLO, Avez-vous des exemples d'analyse? Voir l'exemple de fichier XML ci-dessous. Je voudrais extraire les vitesses et les températures du ventilateur.Parse Fichier de réponse iLO XML avec Perl

<?xml version="1.0"?> 
<GET_EMBEDDED_HEALTH_DATA> 
<FANS> 
    <FAN> 
     <LABEL VALUE = "Fan 1"/> 
     <ZONE VALUE = "System"/> 
     <STATUS VALUE = "Ok"/> 
     <SPEED VALUE = "81" UNIT="Percentage"/> 
    </FAN> 
    <FAN> 
     <LABEL VALUE = "Fan 2"/> 
     <ZONE VALUE = "System"/> 
     <STATUS VALUE = "Not Installed"/> 
     <SPEED VALUE = "n/a" UNIT="n/a"/> 
    </FAN> 
    <FAN> 
     <LABEL VALUE = "Fan 3"/> 
     <ZONE VALUE = "System"/> 
     <STATUS VALUE = "Ok"/> 
     <SPEED VALUE = "81" UNIT="Percentage"/> 
    </FAN> 
    <FAN> 
     <LABEL VALUE = "Fan 4"/> 
     <ZONE VALUE = "System"/> 
     <STATUS VALUE = "Not Installed"/> 
     <SPEED VALUE = "n/a" UNIT="n/a"/> 
    </FAN> 
    <FAN> 
     <LABEL VALUE = "Fan 5"/> 
     <ZONE VALUE = "CPU 1"/> 
     <STATUS VALUE = "Ok"/> 
     <SPEED VALUE = "81" UNIT="Percentage"/> 
    </FAN> 
    <FAN> 
     <LABEL VALUE = "Fan 6"/> 
     <ZONE VALUE = "CPU 2"/> 
     <STATUS VALUE = "Not Installed"/> 
     <SPEED VALUE = "n/a" UNIT="n/a"/> 
    </FAN> 
</FANS> 
<TEMPERATURE> 
    <TEMP> 
     <LABEL VALUE = "Temp 1"/> 
     <LOCATION VALUE = "Ambient"/> 
     <STATUS VALUE = "Ok"/> 
     <CURRENTREADING VALUE = "32" UNIT="Celsius"/> 
     <CAUTION VALUE = "40" UNIT="Celsius"/> 
     <CRITICAL VALUE = "45" UNIT="Celsius"/> 
    </TEMP> 
    <TEMP> 
     <LABEL VALUE = "Temp 2"/> 
     <LOCATION VALUE = "Memory"/> 
     <STATUS VALUE = "Ok"/> 
     <CURRENTREADING VALUE = "48" UNIT="Celsius"/> 
     <CAUTION VALUE = "110" UNIT="Celsius"/> 
     <CRITICAL VALUE = "120" UNIT="Celsius"/> 
    </TEMP> 
    <TEMP> 
     <LABEL VALUE = "Temp 3"/> 
     <LOCATION VALUE = "CPU 1"/> 
     <STATUS VALUE = "Ok"/> 
     <CURRENTREADING VALUE = "30" UNIT="Celsius"/> 
     <CAUTION VALUE = "100" UNIT="Celsius"/> 
     <CRITICAL VALUE = "100" UNIT="Celsius"/> 
    </TEMP> 
    <TEMP> 
     <LABEL VALUE = "Temp 4"/> 
     <LOCATION VALUE = "CPU 1"/> 
     <STATUS VALUE = "Ok"/> 
     <CURRENTREADING VALUE = "30" UNIT="Celsius"/> 
     <CAUTION VALUE = "100" UNIT="Celsius"/> 
     <CRITICAL VALUE = "100" UNIT="Celsius"/> 
    </TEMP> 
    <TEMP> 
     <LABEL VALUE = "Temp 5"/> 
     <LOCATION VALUE = "I/O Board"/> 
     <STATUS VALUE = "Ok"/> 
     <CURRENTREADING VALUE = "46" UNIT="Celsius"/> 
     <CAUTION VALUE = "63" UNIT="Celsius"/> 
     <CRITICAL VALUE = "68" UNIT="Celsius"/> 
    </TEMP> 
    <TEMP> 
     <LABEL VALUE = "Temp 6"/> 
     <LOCATION VALUE = "CPU 2"/> 
     <STATUS VALUE = "n/a"/> 
     <CURRENTREADING VALUE = "n/a" UNIT="n/a"/> 
     <CAUTION VALUE = "100" UNIT="Celsius"/> 
     <CRITICAL VALUE = "100" UNIT="Celsius"/> 
    </TEMP> 
    <TEMP> 
     <LABEL VALUE = "Temp 7"/> 
     <LOCATION VALUE = "CPU 2"/> 
     <STATUS VALUE = "n/a"/> 
     <CURRENTREADING VALUE = "n/a" UNIT="n/a"/> 
     <CAUTION VALUE = "100" UNIT="Celsius"/> 
     <CRITICAL VALUE = "100" UNIT="Celsius"/> 
    </TEMP> 
</TEMPERATURE> 
+2

Ce n'est pas un code XML valide, est-ce que cela renvoie vraiment? N'utilisez pas un analyseur strict si c'est le cas. from xmllint: erreur d'analyse: Fin prématurée des données dans la balise GET_EMBEDDED_HEALTH_DATA ligne 2 – MkV

+0

-1 D'après vos commentaires ci-dessous, il est évident que vous avez un problème d'installation et non un problème d'analyse syntaxique. Supprimez cette question et commencez-en une autre. – lexu

Répondre

2

Cela dépend, et comme d'habitude il y a beaucoup de façons de le faire. Cela dépend principalement de la taille du fichier (réel). Si c'est gros, je recommanderais d'utiliser un module comme XML::Twig pour le couper en petits morceaux avant l'analyse. Il est petit, comme votre fichier d'exemple, presque tout devrait faire. Par exemple XML::LibXML::XPathContext pourrait le faire comme ceci (note: vous allez faire à bon escient pour ajouter une erreur code de vérification à l'analyse syntaxique et éventuellement valider le XML au préalable):

#!/us/bin/perl                       

use warnings;                        
use strict;                        

use XML::LibXML;                       
use XML::LibXML::XPathContext;                   

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

my $doc = $parser->parse_file('test.xml');                

my @nodes = $doc->findnodes('//FAN/SPEED');                

foreach my $node(@nodes){                     
    printf("fan: %s %s\n", $node->getAttribute('VALUE'), $node->getAttribute('UNIT'));      
} 

qui donne cette sortie:

fan: 81 Percentage 
fan: n/a n/a 
fan: 81 Percentage 
fan: n/a n/a 
fan: 81 Percentage 
fan: n/a n/a 

Vous aurez probablement besoin d'un quick intro to XPath

+0

une idée si je peux utiliser XML simple avec cela? – Mike

+0

oui ... je ne peux pas sembler pouvoir installer XPath sur ma boîte debian, même avec "apt-get install libxml-libxml-perl" – Mike

+0

@Mike: à moins que vous soyez sur etch ou plus vieux, cela devrait le faire . Comment cela échoue-t-il pour vous? – ysth