2013-06-05 3 views
4

Я выборочно исправляю некоторые элементы и атрибуты. К сожалению, наши входные файлы содержат как одно-, так и двойные кавычки. Кроме того, некоторые значения атрибутов содержат кавычки (внутри значения).Perl XML :: Twig - сохранение котировок в атрибутах и ​​вокруг них

Использование XML :: Twig, я не могу понять, как сохранить все кавычки вокруг значений атрибутов.

Вот пример кода:

use strict; 
use XML::Twig; 

my $file=qq(<file> 
    <label1 attr='This "works"!' /> 
    <label2 attr="This 'works'!" /> 
</file> 
); 

my $fixes=0; # count fixes 
my $twig = XML::Twig->new(twig_handlers => { 
          '[@attr]' => sub {fix_att(@_,\$fixes);} }, 
          # ... 
          keep_atts_order => 1, 
          keep_spaces => 1, 
          keep_encoding => 1,); 
#$twig->set_quote('single'); 

$twig->parse($file); 
print $twig->sprint(); 

sub fix_att { 
    my ($t,$elt,$fixes) [email protected]_; 
    # ... 
} 

Приведенный выше код возвращает недопустимый XML для label1:

<label1 attr="This "works"!" /> 

Если добавить:

$twig->set_quote('single'); 

Тогда мы увидели бы недопустимый XML для Метка2 :

<label2 attr='This 'works'!' /> 

Есть ли возможность сохранить существующие кавычки? Или есть лучший подход для выборочной фиксации веток?

+0

Обновите версию '' XML :: Twig' от версии 3.37 до версии CPAN (3.44). Если вы все еще видите эту проблему, сообщите об этом как ошибку в CPAN. – toolic

+0

Проблема все еще существует в 3.44. В качестве обходного пути я добавил дополнительный twig_handler, чтобы изменить все двойные кавычки внутри значений атрибутов на одинарные кавычки: '' * '=> sub {my ($ t, $ elt) = @ _; foreach (ключи% {$ elt-> atts}) {$ {$ elt-> atts} {$ _} = ~ s/\ "/ \ '/ g;}},' – ALF

ответ

1

Есть ли у вас какие-либо конкретные причины использовать keep_encoding? Без него котировка правильно закодирована.

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

+0

Мне нужно сохранить исходную кодировку Mirod, можете ли вы предложить альтернативный метод для сохранения кодировки? Спасибо. – ALF

+0

попробуйте выполнить 'binmode STDOUT, sprintf ("encoding (:% s)", $ twig-> encoding); 'перед печатью ветки. кодирование STDOUT до правильного значения. Протестируйте его, хотя я не уверен на 100%, что все кодировки XML поддерживаются Perl. – mirod

Смежные вопросы