Использование 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. Исправление искаженных данных, вероятно, проще.