Perl XML::LibXML搜索属性值和计数发生次数

Perl XML::LibXML搜索属性值和计数发生次数,xml,perl,search,xml-libxml,Xml,Perl,Search,Xml Libxml,因此,这段代码将属性值从一个源匹配到另一个具有完全相同结构的源,因此我没有显示xml。我只是想知道flashxml::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

因此,这段代码将属性值从一个源匹配到另一个具有完全相同结构的源,因此我没有显示xml。我只是想知道flashxml::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";
        }
    }
}

干杯

您最好在每个结构中循环一次,而不是每次循环第二个XML,但是,您知道。XML文件是否小可能无关紧要,但如果它们很大,则可能值得这样做

e、 g

然后您可以查看
%movie\u id
,每个键的值要么是1(不匹配),要么是>1(匹配)

您可以先合并这两个文件,然后执行类似的操作,但只需要查看一个XML文件

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的列表;你想做什么就做什么,把它打印出来,分配给一个数组——这都是你的。

@Adam Taylor是对的,在这里你无数次地重复查看详细信息2,每次查看详细信息1都是一次又一次——这是相当浪费周期的。但是,我认为你的XML结构中有一个设计缺陷,将电影ID属性放入-标记中。ID应该是唯一的属性值。您的movie_ID只是另一个数据实体,与或类似,应该有自己的元素。--因为它不是,所以它在任何一个文件中都已经有重复的电影ID,所以%ids计数器的总数将越来越多,这使得这种方法不是一个好的解决方案。--如果我错了,请纠正我,这样解决方案就会起作用。它现在可以处理每个文件中可能出现但不应该出现多次的电影id,它只是计算每个XML文档中的id,然后检查一个哈希计数器的键是否存在于另一个中。我知道你的意思VanHoesel,电影id应该是唯一的,但在这种情况下,情况并非如此。这是我们必须用于作业的数据,但它有很大的缺陷,所以我一直在处理它,同时也在学习(非常感谢您的输入)。我已经更改了数据,以便同一部电影可以有多个评论员。我现在在想,我应该为每个评论添加另一个属性作为唯一的id。也就是说,我在比较id,我已经开始了一个新的数据结构,并且要检查一个评论是否已经存在于新的数据结构中,如果不存在,那么添加它Hanks-是的,我知道代码是不正确的-从多个方面来看它也很棒,我真的学到了很多东西,你的尝试没有错,如果文件很小,你的循环次数超过你需要的次数,这可能并不重要。如果您处理的是较大的文件,那么最好了解其他技术。你边走边学。祝你好运。
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;