Исключение XML: недопустимый символ (ы)
Я работаю над небольшим проектом, который получает XML-данные в строковой форме из давно запущенного приложения. Я пытаюсь загрузить эти строковые данные в XDocument
(System.Xml.Linq.XDocument
), а затем оттуда сделать некоторые XML Magic и создать файл xlsx для отчета по данным.
Иногда я получаю данные с недопустимыми символами XML, а при попытке проанализировать строку в XDocument
, я получаю эту ошибку.
[System.Xml.XmlException] Сообщение: '?', Шестнадцатеричное значение 0x1C, является недопустимым символом.
Так как у меня нет контроля над удаленным приложением, вы можете ожидать ЛЮБОГО типа персонажа.
Мне хорошо известно, что XML имеет способ разместить в нем символы, такие как 
или что-то в этом роде.
Если вообще возможно, я СЕРЬЕЗНО хотел бы сохранить ВСЕ данные. Если нет, то пусть это будет.
Я подумал о том, чтобы отредактировать строку ответа программно, а затем вернуться и попытаться повторно разобрать, если будет создано исключение, но я попробовал несколько методов, и ни один из них не кажется успешным.
Спасибо за вашу мысль.
Код - это что-то вроде строки:
TextReader tr;
XDocument doc;
string response; //XML string received from server.
...
tr = new StringReader (response);
try
{
doc = XDocument.Load(tr);
}
catch (XmlException e)
{
//handle here?
}
Ответы
Ответ 1
XML может обрабатывать практически любой символ, но существуют диапазоны, управляющие коды и т.д., что это не будет.
Лучше всего, если вы не можете заставить их исправить их выход, - это санировать необработанные данные, которые вы получаете. Вам нужно заменить незаконных символов на указанный вами ссылочный формат символов.
(Вы даже не можете прибегать к CDATA, так как нет возможности избежать этих символов там.)
Ответ 2
Вы можете использовать XmlReader и установить для свойства XmlReaderSettings.CheckCharacters значение false. Это позволит вам прочитать XML файл, несмотря на недопустимые символы. Оттуда вы можете импортировать его в объект XmlDocument или XDocument.
В моем блоге вы можете прочитать немного больше.
Чтобы загрузить данные в файл System.Xml.Linq.XDocument, это будет выглядеть примерно так:
XDocument xDocument = null;
XmlReaderSettings xmlReaderSettings = new XmlReaderSettings { CheckCharacters = false };
using (XmlReader xmlReader = XmlReader.Create(filename, xmlReaderSettings))
{
xmlReader.MoveToContent();
xDocument = XDocument.Load(xmlReader);
}
Более подробную информацию можно найти здесь.
Ответ 3
Будет ли полезно использовать в этом сообщении в блоге?
В принципе, он создает очищающий поток xml.
Ответ 4
Если ваш вход не является XML, вы должны использовать что-то вроде Tidy или Tagsoup, чтобы очистить беспорядок.
Они будут принимать любые данные и, надеюсь, попытаться сделать из него полезную DOM.
Я не знаю, как называются библиотеки темной стороны.
Ответ 5
Мусор, вывоз мусора. Если удаленное приложение отправляет вам мусор, то это все, что вы получите. Если они думают, что отправляют XML, они должны быть исправлены. В этом случае вы не делаете им никаких выгод, работая над своей ошибкой.
Вы также должны убедиться в том, что, по их мнению, они отправляют. Что для них означает% 1C? Чего они хотели?
Ответ 6
ИМХО лучшим решением было бы изменить код/программу/независимо от того, что привело к недопустимому XML, который подается в вашу программу. К сожалению, это не всегда возможно. В этом случае вам нужно избежать всех символов < 0x20 перед загрузкой документа.
Ответ 7
Если вы действительно не можете исправить исходные XML-данные, рассмотрите подход, подобный описанному в этом ответе. В принципе, вы создаете подкласс TextReader (например, StripTextReader), который обертывает существующий TextReader (tr) и отбрасывает недопустимые символы.