c#读取包含不同编码字符的XML的问题

本文关键字:XML 问题 编码字符 读取 包含不 | 更新日期: 2023-09-27 17:51:17

我在读取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提供任何选项来忽略字符编码或类似的内容。

期待您的回复。提前感谢

c#读取包含不同编码字符的XML的问题

首先要注意的是,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文件,第一步是抱怨(大声)它。这种行为没有正当的理由。如果你必须处理它们,我建议你看看UTF8Encoding类和它的DecoderFallbackProperty。看起来你应该能够实现一个自定义的DecoderFallbackBuffer和DecoderFallbackBuffer来添加能够理解UTF-16字节序列的逻辑。