2009-05-12 2 views
12

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

Иногда я получаю данные с недопустимыми символами 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? 
} 

ответ

11

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

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

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

0

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

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

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

9

Возможно, что-то, как описано in this blog post?

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

+0

На самом деле, он обрабатывает XML все сразу, как строку. –

+0

@Matthew, да, вот пример, который он называет .ReadToEnd(), но вы могли бы просто использовать .Read() и т. Д. Мое предположение - это то, что OP будет делать то, что вы сказали. –

+0

Эта ссылка была чрезвычайно полезна – Meiscooldude

0

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

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

+1

Мне жаль, что я не смог исправить их ошибку, но я не ... Ошибка возникает из-за нефильтрованного ввода пользователем ... Некоторые пользователи решают поставить там какие-то сверхъестественные символы ... и он принимает это. .. – Meiscooldude

+0

Моей рекомендацией было бы отказаться от мусора, а затем подготовить отчет о том, что было отклонено. Затем отправьте этот отчет владельцу багги-кода, по крайней мере, один раз в месяц. –

0

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

0

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

+0

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

14

Вы можете использовать XmlReader и установите XmlReaderSettings.CheckCharacters свойство ложной , Это позволит вам прочитать XML-файл, несмотря на недопустимые символы. Оттуда вы можете импортировать его в объект XmlDocument или XDocument.

В моем blog вы можете прочитать немного больше.

Чтобы загрузить данные в 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); 
} 

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

+2

** Ссылки по MSDN: ** [Свойство XmlReaderSettings.CheckCharacters] (http://msdn.microsoft.com/en-us/library/system.xml.xmlreadersettings.checkcharacters%28v=vs.110%29.aspx) и [XmlReader.MoveToContent Method] (http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.movetocontent%28v=vs.110%29.aspx). – DavidRR