gpt4 book ai didi

c# - 如何在 C# 中针对 Stream 安全地创建 XPathNavigator?

转载 作者:行者123 更新时间:2023-11-30 22:50:59 24 4
gpt4 key购买 nike

给定流作为输入,我如何针对 XML 数据源安全地创建 XPathNavigator?

XML 数据源:

  • 可能包含需要删除的无效十六进制字符。
  • 可能包含与文档声明的编码不匹配的字符。

例如,云中的某些 XML 数据源将声明编码为 utf-8,但实际编码为 windows-1252 ISO 8859-1,这可能导致在针对 Stream 创建 XmlReader 时抛出无效字符异常。

来自 StreamReader.CurrentEncoding 属性文档:“当前阅读器使用的当前字符编码。在第一次调用 StreamReader 的任何 Read 方法后,该值可能不同,因为编码自动检测不是直到第一次调用 Read 方法时才完成。”这似乎表明 CurrentEncoding 可以在第一次读取后进行检查,但是当我们需要将 XML 数据写出到 Stream 时,我们是否一直在存储此编码?

我希望找到一种最佳实践来针对 XML 数据源安全地创建 XPathNavigator/IXPathNavigable 实例,该实例将优雅地处理编码无效字符的问题(最好是在 C# 中)。

最佳答案

当一些 XML 片段使用错误的编码导入 CRM 系统时,我遇到了类似的问题(没有编码与 XML 片段一起存储)。

在一个循环中,我使用列表中的当前编码创建了一个包装流。编码是使用 DecoderExceptionFallback 和 EncoderExceptionFallback 选项构造的(如@Doug 所述)。如果在处理过程中抛出 DecoderFallbackException,则重置原始流并使用下一个最可能的编码。

我们的编码列表类似于 UTF-8、Windows-1252、GB-2312 和 US-ASCII。如果您从列表末尾掉下来,那么流真的很糟糕并且被拒绝/忽略/等等。

编辑:

我准备了一个快速示例和基本测试文件(来源 here)。该代码没有任何启发式方法可以在匹配同一组字节的代码页之间进行选择,因此 Windows-1252 文件可能会被检测为 GB2312,反之亦然,具体取决于文件内容和编码首选项顺序。

关于c# - 如何在 C# 中针对 Stream 安全地创建 XPathNavigator?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/255171/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com