2014-11-24 3 views
0

특정 태그의 발생을 계산하기 위해 XML :: Simple을 사용하여 XML 파일을 구문 분석하려고합니다 (즉, 제목과 관련된 다른 도시 위치의 발생 그는 생성 된 번호에 대한 자세한 분석을 수행하기 위해 파일에서 반복됩니다 예를 들면 다음과 같습니다.XML :: Simple을 사용하여 태그 발생을 계산할 XML 파일 구문 분석

<XML> 
    <title> Teacher </title> 
    <state> TX </state> 
    <city> Dallas </city> 

    <title> Teacher </title> 
    <state> CA </state> 
    <city> Los Angeles </city> 

    <title> Engineer </title> 
    <state> NY </state> 
    <city> Manhattan </city> 

    <title> Engineer </title> 
    <state> NY </state> 
    <city> Manhattan </city> 
</XML> 

은 어떻게 든 타이틀이 발생 횟수 등 지역의 다양한 #

을 계산해야 교사 : 2 도시 : 2

엔지니어 : 2 개 도시 : 1

내가 가진 무엇 :이 슈퍼 기본이고 정말 아무것도 생산하지, 나는 완전히 잃은 초보자이기 때문에 그것이 알고

#!/usr/bin/env perl 

    use XML::Simple; 
    use Data::Dumper; 

    # initialize variables 
    my $counter = 0; 
    my @titlelist =(); 
    my @citylist =(); 

    # create object 
    $xml = new XML::Simple; 

    # read XML file 
    my $jobs = $xml->XMLin("sample.xml"); 

    print Dumper($jobs); 

    foreach my $titles(@{$jobs->{job}}) { 
     push(@citylist, $titles->{city}); 
     push(@titlelist, $titles->{title}); 
    } 

    print "@titlelist\n"; 
    print "@citylist\n"; 

이것을 논리적으로 접근하는 방법에 관해서. 나는 이런 종류의 출력을 얻기 위해 사용해야하는 구조를 이해하는 데 정말로 도움이 필요하며, 올바른 방향으로 모든 포인터를 이해할 수 있습니다. 기본적으로 결과를 배열로 푸시하는 것입니다. 문자열 비교를 수행하고 해당 도시 및 제목 카운터를 기반으로해야합니까? 이를 위해 다차원 배열이 필요합니까? 어떤 아이디어라도 도움이 될 것입니다 ... 감사합니다!

답변

0

올바른 방향으로 안내 할 수 있습니다.

첫째, 내가 actualy 당신의 XML은 각 작업 주위 <job> 태그가 있다고 가정가는거야 내가 코드의 다음 비트의 변수 이름을 변경 제안거야, 지금이

<XML> 
    <job> 
     <title> Teacher </title> 
     <state> TX </state> 
     <city> Dallas </city> 
    </job> 

처럼 보인다 무슨 일이 벌어 지는지 명확하게하기 위해

my $xml_data = $xml->XMLin("sample.xml"); 

# We want the list of things with the "<job>" tag 
my $jobs = $xml_data->{job}; 

print Dumper($jobs); # this will now print a list (an arrayref) 

# Now we look at each job in the list of jobs 
# You can read this in english as "for each job in jobs" 
foreach my $job (@$jobs) { 
    # each $job has a city and title: 
    print "here is a job in the city $job->{city} with the title $job->{title}\n"; 
} 

그게 도움이 될 것입니다. 이 시점에서 Perl에서 해시가 어떻게 작동하는지 읽어야합니다. 해결책은 이와 같이 보일 것입니다. 그러나 해시를 아직 이해하지 못했다면 이해가되지 않을 것입니다.

$num_jobs_for{ $title } ++; 
$num_jobs_for_title_in_city{ $title }{ $city } ++ 

행운을 빈다! 그리고 더 멀리 갈 때 다시 게시하십시오.