Разбор Perl с XML :: Простые и Добавление Escape-символов - PullRequest
3 голосов
/ 24 января 2012

Мне нужно экранировать определенные символьные значения из данных, возвращаемых при разборе XML, который я делаю. Проблема в том, что мне нужно иметь какую-то проверку для ВСЕХ значений при разборе xml. Например, если у меня есть следующее:

<data>this is sample data"</data>

Мне нужно иметь возможность добавить escape-символ перед значением символа двойной кавычки, чтобы, если значение сохранялось в $ x, а я печатал $ x, оно показывало:

this is sample data\"

Спасибо.

Ответы [ 3 ]

3 голосов
/ 24 января 2012

Это не имеет ничего общего с XML, анализом или их комбинацией.У вас есть переменная, которая содержит

this is sample data"

Вы хотите изменить эту переменную, чтобы она содержала

this is sample data\"

Вы можете экранировать каждый несловарный символ, используя quotemeta

my $s = 'this is sample data"';
my $escaped = quotemeta($s);

Вы можете экранировать только определенные символы (скажем, \ и "), используя оператор подстановки.

my $s = 'this is sample data"';
( my $escaped = $s ) =~ s/(?=[\\"])/\\/g;

Perl 5.14 +:

my $s = 'this is sample data"';
my $escaped = $s =~ s/(?=[\\"])/\\/rg;
3 голосов
/ 24 января 2012

Из XML::Simple perldoc:

По умолчанию «XMLout ()» преобразует символы «<», «>», «&» и «» в &lt;, &gt;, &amp; и &quot; соответственно.

Если вы хотите, чтобы эти символы были должным образом экранированы как допустимый XML при преобразовании из хэш-ссылки в строку XML (т.е. перед написанием вашего XMLобратно в файл), тогда вам не нужно ничего менять.

Если вы хотите экранировать эти символы другим способом при преобразовании в строку XML, вы должны расширить XML::Simple и переопределить метод escape_value()(обратите внимание, что обратная косая черта не является правильным способом экранирования этих символов в XML).

Если вы хотите экранировать содержимое скалярных значений в хэш-функции, созданной XMLin() по какой-то другой причине, тогдадругие ответы сделают всю работу.

0 голосов
/ 24 января 2012

XML::Simple не будет экранировать символы для вас, потому что в XML экранирование выполняется с сущностями - например, двойная кавычка представляется как &quot;.

Встроенная функция Perl quotemeta может быть тем, что вам нужно. Он избегает всего, что не является буквенно-цифровым или подчеркиванием.

print quotemeta q/this is sample data"/;

OUTPUT

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