использование C # XmlReader на слегка искаженном XML - PullRequest
9 голосов
/ 11 июля 2011

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

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

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

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

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

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 11 июля 2011

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

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

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

1 голос
/ 11 июля 2011

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

1 голос
/ 11 июля 2011

XmlReader строго.Любое несоответствие приведет к ошибке.

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

...