Я загружаю XML-контент из Adobe Connect API. Я загружаю содержимое в XDocument и просматриваю все элементы sco, чтобы сохранить их в базе данных. Однако один из вызовов API содержит недопустимый символ, который вызывает исключение:
System.Xml.XmlException: '', hexadecimal value 0x0B, is an invalid character. Line 2, position 6495.
at System.Xml.XmlTextReaderImpl.Throw(Exception e)
at System.Xml.XmlTextReaderImpl.Throw(String res, String[] args)
at System.Xml.XmlTextReaderImpl.ParseText(Int32& startPos, Int32& endPos, Int32& outOrChars)
at System.Xml.XmlTextReaderImpl.ParseText()
at System.Xml.XmlTextReaderImpl.ParseElementContent()
at System.Xml.XmlTextReaderImpl.Read()
at System.Xml.Linq.XContainer.ReadContentFrom(XmlReader r)
at System.Xml.Linq.XContainer.ReadContentFrom(XmlReader r, LoadOptions o)
at System.Xml.Linq.XDocument.Load(XmlReader reader, LoadOptions options)
at System.Xml.Linq.XDocument.Load(XmlReader reader)
at ACRS.DataRefresherApp.Program.GetFolderContents(Folder parentFolder, AcrsDbContext db) in xxx:line 164
Вот пример XML-кода, полученного от Adobe Connect API. Примечание: этот пример не содержит недопустимый символ.
<?xml version="1.0"?>
<results>
<status code="ok"/>
<scos>
<sco is-folder="1" duration="" display-seq="0" icon="folder" type="folder" folder-id="xx" source-sco-id="" sco-id="xx">
<name>Shared Templates</name>
<url-path>/f1101964883/</url-path>
<date-created>2010-09-16T15:21:15.993+10:00</date-created>
<date-modified>2013-12-11T22:31:05.130+11:00</date-modified>
<is-seminar>false</is-seminar>
</sco>
.....
</scos>
</results>
Вот код, который я использую для чтения/загрузки данных XML.
Stream responseStream = response.GetResponseStream();
XmlReader xmlReader = XmlReader.Create(responseStream, new XmlReaderSettings() { CheckCharacters = false });
var xmlResponse = XDocument.Load(xmlReader);
var folders = xmlResponse.Elements("results").Elements("scos").Elements("sco").ToList();
Исключение возникает, когда XDocument пытается загрузить данные из xmlReader.
var xmlResponse = XDocument.Load(xmlReader);
Я понимаю, что мне не нужно использовать XmlReader и я могу загрузить XDocument напрямую из потока. Однако я включил XmlReader в ответ на эту ссылку запись в блоге Пола Селлеса.
Я уже прочитал эту тему: Как чтобы предотвратить System.Xml.XmlException: недопустимый символ в данной кодировке
Однако это не решает мою проблему. По-видимому, стандарты XML заставляют программу чтения по умолчанию использовать объявленную кодировку документа после того, как документ будет прочитан. В случае моего документа, в котором не делается никаких объявлений, по умолчанию он должен быть UTF-8. см. этот ответ.
CheckCharacters = false
работает только для недопустимых ссылок на сущности, см. XmlReaderSettings CheckCharacters=false, похоже, не работает. - person dbc   schedule 03.08.2016