繁体   English   中英

C#问题,其中读取具有不同编码字符的XML

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM