Использование C# XmlReader на слегка искаженном XML

Я пытаюсь использовать C# XmlReader для большой серии XML-файлов, они все правильно отформатированы, за исключением нескольких избранных (к сожалению, я не в состоянии их изменить, потому что это сломало бы много другого кода).

Ошибки происходят только от одной конкретной части этих оскорбительных XML-файлов, и можно просто их пропустить, но я не хочу прекращать чтение остальной части XML-файла.

Плохие части выглядят так:

 <InterestingStuff>
  ...
    <ErrorsHere OptionA|Something = "false" OptionB|SomethingElse = "false"/>
    <OtherInterestingStuff>
    ...
    </OtherInterestingStuff>
</InterestingStuff>

Так что на самом деле, если бы я мог просто игнорировать недопустимые теги или игнорировать символ канала, я был бы в порядке.

Попытка использовать XmlReader.Skip(), когда я вижу имя "ErrorsHere", не работает, по-видимому, он уже читает немного вперед и выдает исключение.

TLDR: Как мне пропустить, чтобы я мог читать в XML-файле выше, используя XmlReader?

Редактировать:

Некоторые люди предлагали просто заменить символ "|", но идея XmlReader состоит в том, чтобы загружать не весь файл, а только те части, которые вам нужны, поскольку я читаю непосредственно из файлов, я не могу позволить себе читать файлы целиком, заменить все случаи '|' а затем снова прочитать части:).

3 ответа

Решение

Я немного экспериментировал с этим в прошлом.

В общем, вклад просто должен быть правильно сформирован. XmlReader перейдет в неисправимое состояние ошибки, когда основные правила XML будут нарушены. Легко избежать проверки схемы, но здесь это не актуально.

Единственный вариант - очистить ввод, который можно выполнить потоковым способом (пользовательский поток или TextReader), но для этого потребуется легкая форма анализа. Если у вас нет символов трубы в правильных позициях, это легко.

Когда-то у меня была похожая ситуация (с файлами HTML, а не с файлами XML). Но в итоге я использовал регулярное выражение для каждого файла HTML, прежде чем вводить его в свой рабочий конвейер, чтобы удалить искаженные детали. Это пригодилось и было проще, чем бороться с API.:)

XmlReader строгое Любое несоответствие, это будет ошибка.

Так что нет, вы не сможете этого сделать, если не напишите свою собственную реализацию XML. Исправление искаженных данных, вероятно, проще.

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