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

时间:2013-01-11 15:32:44

标签: c# xml encoding

我遇到了阅读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。

期待您的回复。提前致谢

1 个答案:

答案 0 :(得分:4)

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

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

记录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字节序列的逻辑。