0

我在阅读 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。

期待您的回复。提前致谢

4

1 回答 1

4

首先要注意的是 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 字节序列的逻辑。

于 2013-01-11T15:45:08.830 回答