Разобрать файл ответов XML iLO с помощью Perl - PullRequest
0 голосов
/ 03 августа 2009

У меня есть следующий XML-файл, сгенерированный моим сервером iLO HP, У вас есть примеры того, как я могу разобрать это? Смотрите пример XML-файла ниже. Я хотел бы извлечь из него скорость вращения вентилятора и температуру.

<?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> 

1 Ответ

2 голосов
/ 03 августа 2009

Зависит, и, как обычно, есть много способов сделать это. В первую очередь это зависит от размера (фактического) файла. Если он большой, я бы порекомендовал использовать такой модуль, как XML :: Twig , чтобы разрезать его на более мелкие части перед анализом. Он маленький, как ваш файл примера, почти все, что нужно сделать. Например, XML :: LibXML :: XPathContext может сделать это следующим образом (примечание: вы сделаете все возможное, чтобы добавить некоторый код для проверки ошибок в синтаксический анализ и, возможно, заранее проверите xml):

#!/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'));                     
}   

, который дает этот вывод:

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

Вам, вероятно, понадобится краткое введение в XPath

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...