我在读取 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 提供任何选项来忽略字符编码或类似的内容。
期待您的回复。提前致谢
首先要注意的是,XML 文件实际上是有缺陷的 - 不应该像这样在同一个文件中混合文本编码。当文件实际上嵌入了显式编码时,该错误甚至更加明显。
至于为什么用StreamReader可以毫无异常的读取,是因为Encoding中包含了控制遇到不兼容数据时会发生什么的设置
Encoding.UTF8 被记录为使用后备字符。从http://msdn.microsoft.com/en-us/library/system.text.encoding.utf8.aspx 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 http://msdn.microsoft.com/en-us/library/system.text.utf8encoding.aspx
如果您收到此类损坏的 XML 文件,第 1 步就是(大声)抱怨。这种行为没有正当理由。如果您无论如何都必须处理它们,我建议您查看一下 UTF8Encoding 类及其 DecoderFallbackProperty。看来您应该能够实现自定义 DecoderFallback 和 DecoderFallbackBuffer 来添加能够理解 UTF-16 字节序列的逻辑。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)