Как мне безопасно создать XPathNavigator против потока в C #? - PullRequest
2 голосов
/ 01 ноября 2008

Учитывая поток в качестве входных данных, как безопасно создать XPathNavigator для источника данных XML?

Источник данных XML:

  • Может содержать недопустимые шестнадцатеричные символы, которые необходимо удалить.
  • Может содержать символы, которые не соответствуют заявленной кодировке документа.

Например, некоторые источники данных XML в облаке будут иметь объявленную кодировку utf-8 , но фактическая кодировка будет windows-1252 или ISO 8859 -1 , что может вызвать недопустимое исключение символа при создании XmlReader для Stream.

Из документации StreamReader.CurrentEncoding : «Текущая кодировка символов, используемая текущим читателем. Значение может отличаться после первого вызова любого метода Read StreamReader, так как автоопределение кодирования не выполняется до первого вызова метода Read. " Это указывает на то, что CurrentEncoding может быть проверен после первого чтения, но застряли ли мы хранить эту кодировку, когда нам нужно записать данные XML в поток?

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

Ответы [ 3 ]

2 голосов
/ 28 января 2009

У меня была похожая проблема, когда некоторые фрагменты XML были импортированы в систему CRM с использованием неправильной кодировки (не было никакой кодировки, сохраненной вместе с фрагментами XML).

В цикле я создал поток-обертку, используя текущую кодировку из списка. Кодирование было построено с использованием параметров DecoderExceptionFallback и EncoderExceptionFallback (как упомянуто @Doug). Если во время обработки возникло исключение DecoderFallbackException, исходный поток сбрасывается и используется следующая наиболее вероятная кодировка.

Наш список кодировок был чем-то вроде UTF-8, Windows-1252, GB-2312 и US-ASCII. Если вы попали в конец списка, то поток был действительно плохим и был отклонен / проигнорирован / т. Д.

EDIT:

Я набрал быстрый образец и основные тестовые файлы (источник здесь ). В коде нет эвристики для выбора между кодовыми страницами, которые обе соответствуют одному и тому же набору байтов, поэтому файл Windows-1252 может быть определен как GB2312, и наоборот, в зависимости от содержимого файла и порядка предпочтения кодировки.

1 голос
/ 28 января 2009

Можно использовать класс DecoderFallback (и несколько связанных классов) для работы с плохими символами, либо пропуская их, либо делая что-то еще (перезапуск с новой кодировкой?).

0 голосов
/ 01 ноября 2008

При использовании XmlTextReader или чего-то подобного читатель сам определит кодировку, объявленную в файле xml.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...