Ремонт 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 = "тест"

Другие вопросы по тегам