Как вы узнали, совместимый со стандартом синтаксический анализатор XML заменит перевод строки в значении атрибута пробелом, если перевод строки не закодирован с использованием символьной ссылки (например, 

). ( Ссылка )
Поэтому, хотя я обычно рекомендую использовать правильный анализатор XML, это не сработает, потому что мы пытаемся исправить поврежденный XML (то есть * 1036). * это означает что-то отличное от того, что мы хотим, чтобы оно означало).
Мы могли бы написать правильный синтаксический анализатор XML, который просто не выполняет перевод строки в замену пространства, и использовать его для исправления файла, но это много работы. Вероятно, достаточно следующего:
Допущения:
- Все значения атрибутов, которые необходимо исправить, используют двойные кавычки (не одиночные кавычки).
- Двойные кавычки всегда встречается парами в документах, которые необходимо исправить.
fix.pl
:
use strict;
use warnings;
local $/;
while (<>) {
while (1) {
/\G ( [^"]+ ) /xgc
and print $1;
/\G \z /xgc
and last;
/\G ( " [^"]* " ) /xgc
and do {
print $1 =~ s/\n/
/rg;
next;
};
die("Unbalanced quotes");
}
}
Использование:
perl fix.pl file_to_fix.xml >fixed_file.xml
или
perl -i.bak fix.pl file_to_fix.xml
Последний изменяет файл на месте после создания резервной копии.
После использования этого инструмента используйте инструмент сравнения файлов (например, Beyond Compare ), чтобы убедиться в исправлении. был правильно применен.