Вопрос
Формат файла, используемый моим приложением, основан на Xml.У меня только что появился клиент, у которого испорчен xml-файл.Эта штука содержит почти 90 000 строк и по какой-то причине содержит около 20 символов "=", расположенных случайным образом.
Я получаю XmlException для большинства из них с номером строки и позицией символа, что позволяет мне находить оскорбительные символы и удалять их вручную.Я только начал писать небольшое приложение, которое автоматизирует этот процесс, но мне было интересно, есть ли лучшие способы восстановления поврежденных XML-файлов.
Пример неудачной строки:
<item name="InstanceGuid" typ=e_name="gh_guid" type_code="9">ee330f9f-a1e2-451a-8c6d-723f066a6bd4</item>
↑ (this is supposed to be [type_name])
Решение
Вы можете искать любой знак равенства, за которым не следует двойная кавычка. Регулярное выражение (регулярное выражение) было бы довольно просто написать. Р>
Или вы можете просто открыть файл в расширенном текстовом редакторе и выполнить поиск по тому же выражению регулярного выражения, чтобы найти и заменить / удалить. Некоторые текстовые редакторы позволяют находить / заменять на регулярные выражения, поэтому вы можете искать любой знак равенства, за которым не следует двойная кавычка, и просто удалить его. Р>
Конечно, я бы сохранил копию оригинала, так как если бы у вас были одинаковые знаки во внутреннем XML, это могло бы испортить его и т. д.
Другие советы
Используйте регулярное выражение, чтобы сначала очистить xml.
что-то вроде:
s/([^\s"]+)=([^\s"]+="[^"]*")/\1\2/
Очевидно, это необходимо перенести на выбранный вами движок Regex:)
В TextPad, если вы выполните поиск с использованием регулярного выражения =[^"], вы найдете любые знаки =, за которыми не следует "
Это должно найти места в документе, где появились знаки rogue = .Чтобы заменить их, сначала откройте документ в TextPad.Затем нажмите клавишу F8.
В открывшемся диалоговом окне введите следующее:
Найти что:=\([^"]\)
Заменить на:\1
Установите флажок "Регулярные выражения", выберите "Все документы" и нажмите "Заменить все".
Это должно соответствовать всем =, за которыми не следует " и заменить = символом, который действительно следовал за ним.
typename="тест" typ=ename="тест"
станет
typename="тест" typename="тест"