Привет,
У меня есть XML-файл, который мне нужно проверить.Для этого я использую следующий код
use strict;
use warnings;
use XML::Parser;
my $File="folder/file1.xml";
my $p1 = new XML::Parser();
my $p2;
my $Crash_Error_String='';
eval{$p2=$p1->parsefile($File)};
$Crash_Error_String=$@ if !defined $p2 ;
if(!defined $p2){
print $Crash_Error_String . "\n";
}
Теперь, если файл не содержит действительный XML, я получаю строку в переменной $ Crash_Error_String следующим образом:
не правильно сформирован (недопустимый токен) в строке 1771, столбец 58, байт 248467 в строке /usr/lib64/perl5/XML/Parser.pm 187.
Это говорит о том, что существует проблема, связанная с XML, в файле в байте 248467
Теперь я могу распечатать значение, с которым возникает проблема:
my($fh, $File, $byte_position, $byte_value);
$byte_position = 248467;
open($fh, "+<", $File) || die "can't open $File: $!";
binmode($fh) || die "can't binmode $File";
sysseek($fh, $byte_position, 0) # NB: 0-based
|| die "couldn't see to byte $byte_position in $File: $!";
sysread($fh, $byte_value, 1) == 1
|| die "couldn't read byte from $File: $!";
printf "read byte with ordinal value %#02x at position %d\n",
ord($byte_value), $byte_position;
close $fh;
, которое в этом конкретном примере дает
считанный байт с порядковым значением 0x1f в позиции248467
Теперь для моей проблемы: как я могу заменить значение 0x1f на запись _x001f_
Я попробовал следующее (поместив код ниже между вызовами «sysread» и «close»в приведенном выше коде)
sysseek($fh, $byte_position, 0) # NB: 0-based
|| die "couldn't see to byte $byte_position in $File: $!";
my $NewV="_x001f_";
syswrite($fh,$NewV);
Но это сразу помещает новое значение справа от строки проблемы.Кроме того, он пожирает символы справа.
Итак, перед ошибкой у меня есть следующий фрагмент в файле (символ, на который жалуется XML Parser, на самом деле не показан ниже, но в основном это символ междуя и е из vérifier)
для проверки
И после замены у меня есть следующий фрагмент в файле
для vérifi_x001f_éaction
Как вы можете видеть, строка замены сгорела в следующей части строки.
Я хочу заменить:
pour vérifi_x001f_er la réaction
Любая помощь очень ценится.