Ремонт XML в C#
Формат файла, который использует мое приложение, основан на Xml. Я только что получил клиента, у которого есть испорченный файл XML. Эта вещь содержит около 90000 строк и по какой-то причине около 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])
3 ответа
Вы можете искать любой знак равенства, за которым не следует двойная кавычка. Регулярное выражение (регулярное выражение) было бы довольно просто написать.
Или вы можете просто открыть файл в расширенном текстовом редакторе и выполнить поиск по тому же выражению регулярного выражения, чтобы найти и заменить / удалить. Некоторые текстовые редакторы позволяют находить / заменять на регулярные выражения, поэтому вы можете найти любой знак равенства, за которым не следует двойная кавычка, и просто удалить его.
Конечно, я бы сохранил копию оригинала, так как если бы у вас были одинаковые знаки во внутреннем XML, это могло бы испортить его и т. Д.
Используйте регулярное выражение, чтобы сначала очистить xml.
что-то вроде:
s/([^\s"]+)=([^\s"]+="[^"]*")/\1\2/
Очевидно, это должно быть перенесено на ваш движок Regex:)
В TextPad при поиске с использованием регулярного выражения =[^"] вы найдете любые знаки =, за которыми не следует"
Это должно найти места в документе, где появились знаки жулика =. Чтобы заменить их, сначала откройте документ в TextPad. Затем нажмите F8.
В диалоговом окне введите следующее:
Найти что: =\([^"]\)
Заменить на: \1
Установите флажок "Регулярные выражения", выберите "Все документы" и нажмите "Заменить все"
Это должно соответствовать всем =, за которыми не следует ", и заменить = на символ, который следовал за ним.
typename = "test" typ = ename = "test"
станет
typename = "тест" typename = "тест"