[英]C# Issue with reading XML with chars of different encodings in it
我在阅读XML时遇到问题。 找到了解决方案,但是仍然存在一些问题。 不正确的XML文件以UTF-8编码,并且在其标头中具有适当的标记。 但它也包含一个以UTF-16编码的字符-'é'。 此代码用于读取XML文件以验证其内容:
var xDoc = XDocument.Load(taxFile);
它为指定的错误XML文件引发异常:“给定编码中的无效字符。第59行,位置104。” 快速修复如下:
XDocument xDoc = null;
using (var oReader = new StreamReader(taxFile, Encoding.UTF8))
{
xDoc = XDocument.Load(oReader);
}
此代码不会引发不正确文件的异常。 但是'é'字符加载为``。 我的第一个问题是“为什么起作用?”。
另一点是使用XmlReader不会引发异常,直到加载带有'é'的节点为止。
XmlReader xmlTax = XmlReader.Create(filePath);
再一次,使用StreamReader进行锻炼会有所帮助。 同样的问题。 似乎修复解决方案不够好,导致一天:)可能会出现以另一种格式编码的XML,并且可能以错误的方式进行处理。 但是,我尝试处理UTF-16格式的XML文件,它工作正常(配置为UTF-8)。
最后一个问题是XDocument / XmlReader是否提供任何选项来忽略像这样的字符编码或smth。
期待您的答复。 提前致谢
首先要注意的是,XML文件实际上存在缺陷-不应像这样在同一文件中混合文本编码。 当文件实际嵌入显式编码时,错误甚至更加明显。
至于为什么可以使用StreamReader毫无例外地读取它,这是因为Encoding包含用于控制遇到不兼容数据时发生的情况的设置
Encoding.UTF8被记录为使用后备字符。 从http://msdn.microsoft.com/zh-cn/library/system.text.encoding.utf8.aspx :
此属性返回的UTF8Encoding对象可能不适用于您的应用程序。 它使用替换后备替换以问号(“?”)字符替换无法编码的每个字符串和无法解码的每个字节。
您可以自己实例化编码以获得不同的设置。 这很可能就是XDocument.Load()所做的,因为默认情况下隐藏错误通常很不好。 http://msdn.microsoft.com/zh-CN/library/system.text.utf8encoding.aspx
如果发送给您的是这样损坏的XML文件,步骤1是(大声地)抱怨它。 没有正当的理由这种行为。 如果您无论如何绝对必须处理它们,建议您看一下UTF8Encoding类及其DecoderFallbackProperty。 看来您应该能够实现自定义的DecoderFallback和DecoderFallbackBuffer来添加将理解UTF-16字节序列的逻辑。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.