Исключение XML: недопустимые символы - PullRequest
13 голосов
/ 12 мая 2009

Я работаю над небольшим проектом, который получает данные 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?
}

Ответы [ 7 ]

17 голосов
/ 02 августа 2013

Вы можете использовать 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);
}

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

11 голосов
/ 12 мая 2009

XML может обрабатывать практически любой символ, но есть диапазоны, управляющие коды и такие , что он не будет.

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

(Вы даже не можете прибегнуть к CDATA, так как там нет способа убежать от этих персонажей.)

10 голосов
/ 12 мая 2009

Было бы полезно что-то, как описано в этом сообщении в блоге ?

По сути, он создает дезинфицирующий поток XML.

0 голосов
/ 12 мая 2009

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

0 голосов
/ 12 мая 2009

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

0 голосов
/ 12 мая 2009

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

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

0 голосов
/ 12 мая 2009

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

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

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

...