Perl 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 ответа
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 вернет список идентификаторов; чтобы вы могли делать с чем угодно, распечатайте его, назначьте массиву - все ваше.
Возможно, вам будет лучше обходить каждую структуру один раз, а не каждый раз повторять второй 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-файла.