Как определить, какая из нескольких разных ошибок могла вызвать XmlException?
Система, над которой я работаю, использует DataSet.ReadXml(XmlReader)
прочитать файл XML и загрузить его содержимое в DataSet
, Файл XML принадлежит деловому партнеру и может не всегда быть правильно сформированным, но ожидается, что эта система внесет разумные исправления во входные данные.
Мы видели ошибки во входных файлах XML, такие как:
- Случай 1: в середине строкового значения используйте такие символы, как
'<'
,'>'
или мой любимый,'&'
, который вызывает "Произошла ошибка при разборе EntityName. Строка x, позиция y." - Случай 2: в середине строкового значения странные конструкции, такие как
"<3"
так что текст изображает сердце, которое вызывает "Имя не может начинаться с символа" 3 ". Строка х, позиция у". - Случай 3: недопустимые символы для данной кодировки, что приводит к "Недопустимый символ в данной кодировке. Строка x, позиция y."
Если будут приняты некоторые простые правила, эти ошибки могут быть устранены программно:
- Случай 1: замените оскорбительный символ на его символьную сущность XML (
"&"
становится"&"
, так далее. - Случай 2: заменить
"<"
в"<3"
с пробелом, так что это становится" 3"
- Случай 3: заменить недопустимый символ пробелом
Однако все эти ошибки вызывают одно и то же исключение: System.Xml.XmlException
Я хотел бы предпринять соответствующие действия при обнаружении любой из этих ошибок, но как лучше всего это сделать? Эти три разные ошибки имеют одинаковую HRESULT
значение (-2146232000), и до сих пор единственный способ, которым я смог выделить их, - это проверка XmlException.Message
строковое свойство.
Сравнение строк кажется паршивым способом определения точной причины ошибки. Если бы я следовал этому подходу, код сломался бы, если сообщение об исключении изменится в будущих версиях.NET. Это также не будет переносимым на некоторые языки.
Следовательно, как можно программно дифференцировать различные типы ошибок, которые могут быть представлены в XmlException
?
РЕДАКТИРОВАТЬ
В комментариях ниже я получил совет о важности обеспечения высокого качества данных XML. Я не согласен, но, как говорится в моем вопросе, это вне моего контроля, и я ничего не могу с этим поделать. Так что, несмотря на ваши благие намерения, они упускают суть. Если вы знаете хороший способ провести различие между очень многими ошибками, которые могут быть представлены System.Xml.XmlException
Класс, пожалуйста, поделитесь своими знаниями. Спасибо.
1 ответ
Вместо того, чтобы пытаться анализировать не-XML с помощью синтаксического анализатора XML и отлавливать ошибки, если вы действительно хотите обрабатывать не-XML, я бы попытался предварительно обработать его с помощью синтаксического анализатора для конкретной грамматики не-XML, которую вы хотите принять. Прежде чем вы отправите данные в анализатор XML, запустите его через скрипт Perl или аналогичный, который распознает шаблоны, которые вы хотите преобразовать в XML, а затем запустите результат через анализатор XML.