2014-05-20 3 views
1

그래서이 코드는 동일한 구조의 속성 값을 다른 소스와 일치시키는 역할을하므로 xml을 표시하지 않았습니다. 난 그냥 플래시 XML이 :: LibXML이며, 그것을Perl XML :: LibXML 속성 값 검색 및 발생 횟수

#get from one data source 
for my $movie($review_details1->findnodes('/result_set/results/review')){ 
    my $id = $movie->findvalue('@movie_id'); 

    #check if it exists in the other data source 
    for my $new_movie($review_details2->findnodes('result_set/results/review')){ 
     my $new_id = $new_movie->findvalue('@movie_id'); 
     if ($id eq $new_id){ 
     print "ID $id matches NEW ID $new_id\n"; 
     } 
    } 
} 

건배

을 할 수있는 더 나은 방법이있을 것이라고 방법으로 생각
+0

@ Adam Taylor가 맞습니다. 여기서 review_details2를 무수히 반복하면서 각 review_details1을 반복해서 반복합니다. 이는 순환을 낭비하는 것입니다. – vanHoesel

답변

1
my %ids1; 
my %ids2; 

# count all the IDs in Details1 
$ids1{$_->value}++ foreach @{$review_details1->findnodes('book_reviewers/results/reviewer/@movie_id')}; 

# count all the IDs in Details2 
$ids2{$_->value}++ foreach @{$review_details2->findnodes('book_reviewers/results/reviewer/@movie_id')}; 

# pass through all keys from IDs2 that also exist in IDs1 
grep{exists $ids1{$_}} keys %ids2; 

그 grep 문은 id의 목록을 반환합니다. 당신이 좋아하는 것과 상관없이 그것을 인쇄하고 그것을 배열에 할당하십시오 - 모든 것.

+0

을 배우고 있습니다. 그러나, 태그 내에 movie_ID 속성을 두는 XML 구조에 디자인 결함이 있다고 생각합니다. ID는 고유 한 속성 값이어야합니다. movie_ID는 또는 과 같은 다른 데이터 엔티티이며 자신의 요소 여야합니다. --- 아니기 때문에 두 파일에 이미 movie_ID가 중복되어 있으므로 % ids 카운터가 점점 더 늘어나므로이 방법이 좋은 해결책이 아닙니다. --- 내가 틀렸다고 정정하면 솔루션이 작동합니다. – vanHoesel

+0

이제는 각 파일에서 한 번 이상 발생할 수있는 movie_id와 함께 작동 할 수 있지만 모든 파일에서 ID를 계산 한 다음 다른 해시 카운터의 키가 다른 XML 문서에 있는지 확인합니다. – vanHoesel

+0

나는 네가 무슨 뜻인지 안다. VanHoesel, 영화 ID는 고유해야하지만이 경우에는 그렇지 않다. 과제를 위해 사용해야하는 데이터이지만 매우 조작하기에 결함이있어 동시에 (귀하의 의견에 많은 감사를 표합니다) 동시에 학습하십시오. 동일한 동영상에 여러 명의 검토자가있을 수 있도록 데이터를 변경했습니다. 이제 각 리뷰에 다른 ID를 고유 ID로 추가해야한다고 생각합니다. 그것은 새로운 데이터 구조를 시작한 ID를 비교하는 것이고, 새 데이터 구조에 이미 검토가 있었는지 확인한 다음 추가합니다 –

2

당신은을 통해 각각의 구조를 반복 한 번 대신 루핑 더 나을 수 있습니다 두 번째 XML 때마다,하지만, TMTOWTDI. 아마도 XML 파일이 작은 지 여부는 중요하지 않지만 크기가 클 경우 가치가있을 수 있습니다.

my %movie_ids; 
for my $movie($review_details1->findnodes('/result_set/results/review')){ 
    my $id = $movie->findvalue('@movie_id'); 
    $movie_ids{$id}++; 

for my $new_movie($review_details2->findnodes('result_set/results/review')){ 
    my $new_id = $new_movie->findvalue('@movie_id'); 
    $movie_ids{$new_id}++; 

그럼 당신은 %movie_ids를 통해 볼 수 있으며, 각 키의 값은 중 1 (전혀 일치) 또는> 1 (경기) 일 것이다.

두 파일을 먼저 결합한 다음 비슷한 파일을 만들 수 있지만 하나의 XML 파일 만 살펴 봐야합니다.

+0

고마워요 - 네. 코드가 멍청하다는 것을 알았습니다. 하나 이상의 방법으로 그것을 보아도 대단합니다. 정말 많이 배우고 있습니다. –

+0

시도가 잘못되지 않았으며, 더 반복적으로 반복하는 것이 중요하지 않을 수도 있습니다. 파일이 작은 경우 필요한 것보다 큰 파일을 다루는 경우에는 다른 기술을 알고있는 것이 좋습니다. 당신이가는 동안이 물건을 배웁니다. 행운을 빌어 요. –

+0

감사합니다. Adam - 저는 확실히 –