2009-08-03 165 views
0

我有我的iLO HP服務器生成的以下XML文件, 您有任何可以解析它的例子嗎?請參閱下面的示例XML文件。 我想從中提取風扇的速度和溫度。用Perl解析XML iLO響應文件

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

這不是有效的XML,它是真正返回的嗎?如果這是一個問題,請不要使用嚴格的解析器。 from xmllint: 語法分析器錯誤:標記GET_EMBEDDED_HEALTH_DATA行中的數據過早結束2 – MkV 2009-08-03 08:54:12

+0

-1根據您的評論,很明顯,您有安裝問題,而不是解析問題。刪除此問題並開始另一個問題。 – lexu 2009-08-03 13:39:43

回答

2

這取決於,和往常一樣有很多方法可以做到這一點。主要取決於(實際)文件的大小。如果它很大,我建議在解析之前使用像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 

您可能需要一個quick intro to XPath