C#读取带有不同编码字符的XML

我在阅读XML时遇到了问题。 找到了解决方案,但仍有一些问题。 不正确的XML文件以UTF-8编码,并在其标题中包含适当的标记。 但它还包括一个用UTF-16编码的字符 – ‘é’。 此代码用于读取XML文件以validation其内容:

var xDoc = XDocument.Load(taxFile); 

它引发了指定的错误XML文件的exception:“给定编码中的字符无效。第59行,第104位。” 快速解决方法如下:

 XDocument xDoc = null; using (var oReader = new StreamReader(taxFile, Encoding.UTF8)) { xDoc = XDocument.Load(oReader); } 

此代码不会引发错误文件的exception。 但’é’字符加载为 。 我的第一个问题是“它为什么有用?”。

另一点是使用XmlReader不会引发exception,直到加载了’é’的节点。

 XmlReader xmlTax = XmlReader.Create(filePath); 

再次使用StreamReader进行锻炼会有所帮助。 同样的问题。 似乎修复解决方案不够好,导致有一天:)以其他格式编码的XML可能会出现,并且可能以错误的方式进行。 但我试图处理UTF-16格式的XML文件,它工作正常(配置为UTF-8)。

最后一个问题是,是否有任何选项可供XDocument / XmlReader忽略字符编码或像这样的smth。

期待您的回复。 提前致谢

首先要注意的是XML文件实际上存在缺陷 – 不应该在同一个文件中混合文本编码。 当文件实际嵌入了显式编码时,错误更加明显。

至于为什么StreamReader可以毫无例外地读取它,这是因为Encoding包含设置来控制遇到不兼容数据时会发生什么

记录Encoding.UTF8以使用后备字符。 来自http://msdn.microsoft.com/en-us/library/system.text.encoding.utf8.aspx :

此属性返回的UTF8Encoding对象可能没有适合您的应用程序的行为。 它使用替换回退来替换它不能编码的每个字符串以及它不能用问号(“?”)字符解码的每个字节。

您可以自己实例化编码以获得不同的设置。 这很可能是XDocument.Load()所做的,因为默认情况下隐藏错误通常是不好的。 http://msdn.microsoft.com/en-us/library/system.text.utf8encoding.aspx

如果你被发送这样的破解XML文件,第1步就是抱怨(大声)。 这种行为没有正当理由。 如果你绝对必须处理它们,我建议看一下UTF8Encoding类及其DecoderFallbackProperty。 您似乎应该能够实现自定义DecoderFallback和DecoderFallbackBuffer来添加将理解UTF-16字节序列的逻辑。