Подтвердить что ты не робот

Исключение XML: недопустимый символ (ы)

Я работаю над небольшим проектом, который получает XML-данные в строковой форме из давно запущенного приложения. Я пытаюсь загрузить эти строковые данные в XDocument (System.Xml.Linq.XDocument), а затем оттуда сделать некоторые XML Magic и создать файл xlsx для отчета по данным.

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

[System.Xml.XmlException] Сообщение: '?', Шестнадцатеричное значение 0x1C, является недопустимым символом.

Так как у меня нет контроля над удаленным приложением, вы можете ожидать ЛЮБОГО типа персонажа.

Мне хорошо известно, что XML имеет способ разместить в нем символы, такие как &#x1C или что-то в этом роде.

Если вообще возможно, я СЕРЬЕЗНО хотел бы сохранить ВСЕ данные. Если нет, то пусть это будет.


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

Спасибо за вашу мысль.

Код - это что-то вроде строки:

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?
}
4b9b3361

Ответ 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);
}

Более подробную информацию можно найти здесь.

Ответ 4

Если ваш вход не является XML, вы должны использовать что-то вроде Tidy или Tagsoup, чтобы очистить беспорядок.

Они будут принимать любые данные и, надеюсь, попытаться сделать из него полезную DOM.

Я не знаю, как называются библиотеки темной стороны.

Ответ 5

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

Вы также должны убедиться в том, что, по их мнению, они отправляют. Что для них означает% 1C? Чего они хотели?

Ответ 6

ИМХО лучшим решением было бы изменить код/​​программу/независимо от того, что привело к недопустимому XML, который подается в вашу программу. К сожалению, это не всегда возможно. В этом случае вам нужно избежать всех символов < 0x20 перед загрузкой документа.

Ответ 7

Если вы действительно не можете исправить исходные XML-данные, рассмотрите подход, подобный описанному в этом ответе. В принципе, вы создаете подкласс TextReader (например, StripTextReader), который обертывает существующий TextReader (tr) и отбрасывает недопустимые символы.