1

因此,此代码可以将一个来源的属性值匹配到另一个具有完全相同结构的来源,因此我没有显示 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";
        }
    }
}

干杯

4

2 回答 2

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 文件。

于 2014-05-20T09:36:01.083 回答
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 的列表;让您随心所欲地做任何事情,打印它,将它分配给一个数组 - 全部属于您。

于 2014-05-20T12:31:26.543 回答