Perl XML :: LibXML搜索属性值并计算出现次数

时间:2014-05-20 07:22:34

标签: xml perl search xml-libxml

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

干杯

2 个答案:

答案 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的列表;为了你喜欢你喜欢的任何东西,打印它,将它分配给一个阵列 - 所有你的。