我正在从Adobe Connect API下载一些 XML 内容。我正在将内容加载到 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
以下是来自 Adobe Connect API 的 XML 示例。注意:此示例不包含无效字符。
<?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 以响应Paul Selles 的这篇博文。
我已经阅读了这个线程: 如何防止 System.Xml.XmlException: Invalid character in the given encoding
但是,这并不能解决我的问题。显然,一旦阅读文档,XML 标准会导致阅读器默认使用声明的文档编码。在我的文档没有声明的情况下,它应该默认为 UTF-8。看到这个答案。