2014-05-20 51 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

但是,我認爲你的XML結構中存在一個設計缺陷,你在其中放置了一個movie_ID屬性在標籤中。 ID的應該是唯一的屬性值。您的movie_ID只是另一個數據實體,如,並且應該有它自己的元素。 --- 由於不是,它會在任一文件中都有重複的movie_ID,所以%ids計數器會越來越多,這使得這種方法不是一個好的解決方案。 --- 糾正我,如果我錯了,因此解決方案將工作。 – vanHoesel

+0

它現在可以與可能發生但不應該 - 在每個文件中多次出現的movie_id一起使用,它只是對每個XML文檔中的ID進行計數,然後檢查一個哈希計數器的密鑰是否存在於另一個文件中。 – vanHoesel

+0

我知道你的意思是VanHoesel,電影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

謝謝 - 是的,我知道它的代碼是bunky - 很高興看到它在一個以上的方式,我真的學到很多 –

+0

你的嘗試沒有錯,它甚至可能沒有關係,你循環更多次如果文件很小,則需要比您需要的更多。如果你正在處理更大的文件,那麼瞭解其他技術是很好的。你隨時瞭解這些東西。祝你好運。 –

+0

感謝亞當 - 我肯定在學習 –