не может учитывать все специальные символы в XML - PullRequest
0 голосов
/ 24 февраля 2020

Я читаю файл XML, чтобы удалить дубликаты песен в ритмбоксе.

Однако есть много странных символов, которые я не могу найти ни в рифме, ни в имени файла. Они не просто побеги.

Я использую XML::Hash в Perl.

Например, я обнаружил, что

%20 означает один пробел.

%5B означает [

, а %5D означает ]

Какие символы мне нужно экранировать в XML документы? и http://www.escapecodes.info/ близки к тому, что я хочу, но не предоставили никакой полезной информации

Я читаю https://metacpan.org/pod/XML :: Ha sh и я не вижу никаких советов по поводу этих символов.

Я мог бы конвертировать каждый символ назад и вперед, но должен быть более элегантный и читаемый способ сделать это. Поиски в Google ничего не нашли.

#!/usr/bin/env perl

use strict;
use warnings FATAL => 'all';
use diagnostics;
use feature 'say';
use autodie ':all';
use File::Slurp;
use XML::Hash;
use DDP;
use utf8::all;

my $xml_converter = XML::Hash -> new();
my $xml_data = read_file('/home/con/Downloads/rhythmdb.xml');
my $xml_hash = $xml_converter->fromXMLStringtoHash($xml_data);
#p $xml_hash->{rhythmdb}{entry}[0];
my %files_found;
my $new_hash;
my $new_index = 0;
foreach my $song_index (0..scalar @{ $xml_hash->{rhythmdb}{entry} } - 1 ) {
    my $file;
    if (defined $xml_hash->{rhythmdb}{entry}[$song_index]{location}{text}) {
        $file = $xml_hash->{rhythmdb}{entry}[$song_index]{location}{text}
    } else {
        say 'can\'t get file.';
        p $xml_hash->{rhythmdb}{entry}[$song_index];
        die
    }
    $file =~ s/^file:\/\///;
#   $file =~ s/%20/ /g;
#   $file =~ s/%5B/\[/g;
#   $file =~ s/%5D/\]/g;
    $new_hash->{rhythmdb}{entry}[$new_index] = $xml_hash->{rhythmdb}{entry}[$song_index];
    $new_index++;
}

Есть ли более элегантный / идиоматический c способ преобразования всех этих загадочных символов?

1 Ответ

1 голос
/ 24 февраля 2020

Кажется, что это процентное кодирование URL [1].

Если вы знаете, в какие поля будет закодирован URL, вы можете просто использовать что-то для декодирования этих «специальных символов», например, с помощью uri_decode ($ encoded) из URI :: Кодировать [2].

[1] https://en.m.wikipedia.org/wiki/Percent-encoding

[2] https://metacpan.org/pod/URI :: Кодировать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...