2014-10-07 5 views
1

잘 중첩 된 값으로 XML 파일에서 값 목록을 구문 분석/추출하려면 어떻게합니까?Perl을 사용하여 깊게 중첩 된 XML 파일에서 값 목록을 구문 분석/추출하는 방법

XML Simple을 사용해 본 결과, 10 개 이상의 값 목록에서 첫 번째 값만 추출 할 수있었습니다. 먼저 seriesName "Temperature"를 선택하고 해당 그룹 아래의 값을 추출하려고합니다.

:

여기
<chart caption="" subcaption="" palette="6" yAxisMinVal="11800" yAxisMaxVal=17800"xmlns="http: "> 
<categories> 
<category label=""/> 
<category label=""/> 
<category label=""/> 
<category label=""/> 
<category label=""/> 
<category label="6"/> 
<category label=""/> 
<category label=""/> 
<category label=""/> 
<category label=""/> 
<category label="12"/> 
<category label=""/> 
<category label=""/> 
<category label="18"/> 
<category label=""/> 
<category label=""/> 
<category label="21"/> 
<category label=""/> 
</categories> 
- <dataset seriesName="Temperature" color="003366"> 
<Set value=675.0"/> 
<Set value=613.0"/> 
<Set value=612.0"/> 
<Set value=614.0"/> 
<Set value=613.0"/> 
<Set value=413.0"/> 
<Set value=613.0"/> 
<Set value=313.0"/> 
<Set value=213.0"/> 
<Set value=653.0"/> 
<Set value=633.0"/> 
<Set value=623.0"/> 
</dataset> 
<dataset seriesName="Precipitation" color="66CC33"> 
<set value="50.6"/> 
</dataset> 
</chart> 

내가 사용하는 펄 코드 :

내가 T124.xml를 분석하고있는 XML 파일입니다 (나는 그것의 큰 파일로 소화 이것을을 만들었습니다)
#!/usr/bin/perl 
use strict; 
use XML::Simple 'XMLin'; 
use Data::Dumper; 

my $parse = XMLin('T124.xml',forcearray => ['value']); 
#print Dumper($parse); 

foreach my $dataset (@{$parse->{dataset}}) { 
    if ($dataset->{seriesName} eq 'Temperature') { 
     print $dataset->{seriesName} . "\n"; 
     print $dataset->{set}->[0]->{value} . "\n"; 
    } 
} 

내가 (아래 그림 참조) 다음과 같은 출력을보고 싶다 는, 그러나 나는 첫 번째 675.0 값을 추출 할 만 할 수 있어요 :

Temperature 
675.0 
613.0 
612.0 
614.0 
613.0 

ETC ...

+0

는 ['XML :: Simple'] (https://metacpan.org/pod/XML::Simple)를 사용하지 마십시오 [* 오래된 *] (https://metacpan.org/pod/XML::Simple#STATUS-OF-THIS-MODULE). 대신 ['XML :: LibXML'] (https://metacpan.org/pod/XML::LibXML) 또는 ['XML :: Twig'] (https://metacpan.org/pod/XML::Twig)을 사용하십시오.) XPath를 사용하여 심층 노드에 액세스 할 수 있습니다. – Miller

+0

소스에 온도 값이 표시되지 않습니까? 아니면 붙여 넣기에 문제가 있습니까? –

+0

안녕하세요 짐, 소스 XML이 맨 위에 있습니다. 파일 ...의 컨텍스트를 보여줍니다. – BrianB

답변

1

은 여기 XML에서 온도 데이터를 추출하는 간단한 스크립트입니다. 제공 한 소스가 일부 "이 누락 된 것으로 여기에 XML 소스가 포함되었습니다. 나는 데이터를 파싱하기 위해 XML::Twig을 사용했다.

#!/usr/bin/perl 
use warnings; 
use strict; 
use XML::Twig; 

my $xml = '<chart caption="" subcaption="" palette="6" yAxisMinVal="11800" yAxisMaxVal="17800" xmlns="http://"> 
<categories> 
<category label=""/> 
<category label=""/> 
<category label=""/> 
<category label=""/> 
<category label=""/> 
<category label="6"/> 
<category label=""/> 
<category label=""/> 
<category label=""/> 
<category label=""/> 
<category label="12"/> 
<category label=""/> 
<category label=""/> 
<category label="18"/> 
<category label=""/> 
<category label=""/> 
<category label="21"/> 
<category label=""/> 
</categories> 
<dataset seriesName="Temperature" color="003366"> 
<Set value="675.0"/> 
<Set value="613.0"/> 
<Set value="612.0"/> 
<Set value="614.0"/> 
<Set value="613.0"/> 
<Set value="413.0"/> 
<Set value="613.0"/> 
<Set value="313.0"/> 
<Set value="213.0"/> 
<Set value="653.0"/> 
<Set value="633.0"/> 
<Set value="623.0"/> 
</dataset> 
<dataset seriesName="Precipitation" color="66CC33"> 
<set value="50.6"/> 
</dataset> 
</chart>'; 

my $t = XML::Twig->new(); 
$t->parse($xml); # or $t->parsefile($filename); to read from a file 

# this xpath finds all <Set> elements under the <dataset> element 
# where attribute "seriesName" = "Temperature" 
my @sets = $t->findnodes('//dataset[@seriesName="Temperature"]/Set'); 

if (@sets) { 

    my $outfile = '/path/to/output/file.txt'; 
    open my $out, ">", $outfile or die "Could not open $outfile: $!"; 
    print { $out } "Temperature\n"; 
    print { $out } $_->att('value')."\n" for @sets; 
} 

출력 :

Temperature 
675.0 
613.0 
612.0 
614.0 
613.0 
413.0 
613.0 
313.0 
213.0 
653.0 
633.0 
623.0 
그것의로
+0

고마워요 "나는 외계인을 놀라게했다"나는 말로 바꿔서 "/ n"을 덧붙여 동일한 결과를 얻었다. 당신은 저에게 모든 고통을 덜어 주셨습니다. 즉, 나는이 스크립트를 in 및 out 파일을 사용하여 시도하고있다. 추출한 XML 데이터를 CSV 파일로 푸시하고 싶지만 "나뭇 가지"로이를 수행하는 방법을 모르겠습니다. – BrianB

+0

죄송합니다. 나는 다시는 명확하지 않았습니다. 출력 파일은 문제가되지 않습니다 (제공 한 것을 사용 하겠지만) 파일에서 (XML) 구문 분석 구문 인 Im을 잃어 버렸습니다. $ t-> parsefile ("T123.xml") 나는 정확할 것이지만 ... – BrianB

+0

'$ t-> parsefile (...)'할 때 어떻게됩니까? 게시 한 XML이 유효하지 않으므로 구문 분석을 수행하기 전에 수정해야했습니다. 당신도 똑같은 일을해야 할 것입니다. NB : XML 용 문서 :: Twig : * "구문 분석 오류가 발생하면 다이 호출이 발생합니다."* –