因此,此代码可以将属性值从一个源匹配到另一个源,具有完全相同的结构,因此我没有显示xml。我只想到flash 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 :(得分:2)
最好每次循环遍历每个结构,而不是每次循环遍历第二个XML,但是,你知道,TMTOWTDI。如果XML文件很小可能无关紧要,但如果它们很大,则可能值得这样做。
e.g。
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文件。
答案 1 :(得分: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的列表;为了你喜欢你喜欢的任何东西,打印它,将它分配给一个阵列 - 所有你的。