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-файла.

Другие вопросы по тегам