C# 读取包含不同编码字符的 XML 时出现问题

2023-12-23

我在读取 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(使用前将#替换为@)

C# 读取包含不同编码字符的 XML 时出现问题 的相关文章

随机推荐

  • Libusb 以及如何在 Ubuntu 中使用它的软件包

    我已经使用以下命令安装了 libusb 我不确定这是否正确 命令是 sudo apt get install libusb dev 一旦我安装了 我不确定它是否已经安装 因为我是 Ubuntu 的新手用户 我想知道如何使用该库 因为我编写了
  • 如何处理 CMake 中的递归依赖关系

    假设我有包 A B 和 C 包 B 使用包 A 包 C 使用包 B 我创建共享库 所以在包 B 中我做了类似的事情 find package A if A FOUND target link libraries B A LIBRARIES
  • 在c#中将对象的克隆添加到列表中(防止外部修改)

    我有一个像 obj1 我想将其添加到列表中 我可以通过添加它list1 add obj1 现在一旦我更新obj1 我的列表中的对象也在更新 我知道我在这里处理参考文献 我的要求需要修改obj1并再次将其添加到列表中 我没有两个不同的对象 而
  • Pandas concat 产生 ValueError:计划形状未对齐

    在 pandas 中 我尝试连接一组数据帧 但收到此错误 ValueError Plan shapes are not aligned 我的理解 concat 是它会连接相同的列 但对于那些找不到的列 它将用 NA 填充 这里的情况似乎并非
  • 没有 WHERE 的 PostgreSQL 查询仅 ORDER BY 和 LIMIT 不使用索引

    我有一个表 其中包含 BIGSERIAL 类型的 id 列 我也有这一列的索引 降序排序 BTREE 唯一 我经常需要从包含数百万条目的表中检索最后 10 20 30 个条目 如下所示 SELECT FROM table ORDER BY
  • Task.Delay在等待时会浪费系统资源吗?

    我正在尝试定期运行一段代码 中间有时间间隔 可能有多个这样的代码片段同时运行 所以我转向Task Run利用异步方法调用和并行性 现在我想知道我应该如何实现时间间隔 直接的方法是使用Task Delay像这样 var t Task Run
  • 如何用 joda 时间解析“YYYY-MM-DD”

    我正在尝试使用 joda time 来解析以下形式的日期字符串YYYY MM DD 我有这样的测试代码 DateTimeFormatter dateDecoder DateTimeFormat forPattern YYYY MM DD D
  • 获取重复数组值的数组

    我有一个数组 正在其中测试重复值 我想获取仅包含重复值的数组 以便向用户提供错误消息 并指出哪些是有问题的值 我试过 duplicates array diff array with dupes array unique array wit
  • MD5 整个节点以及校验和

    我有一个业务需求 将 Request 标签和子节点放入CDATA或xml字符串中 放入 arg0 元素 Concat
  • 我可以在运行时确定 Java 库的版本吗?

    是否可以在运行时确定第三方 Java 库的版本 第三方Java库是指Jar文件 Jar文件清单具有专门用于指定库版本的属性 注意 并非所有 Jar 文件实际上都指定了版本 即使它们should Java内置的读取该信息的方式是使用反射 但你
  • 找不到命令“git”-Windows

    我正在尝试使用我的 python django 应用程序安装 mongodb engine 但是我收到此错误 Cannot find command git 我正在尝试 mongodb 文档中的这个命令 http django mongod
  • 如何在反应应用程序中令牌过期时注销用户

    我正在开发一个使用 React 作为前端的应用程序React apollo graphql用于我的 API 调用 我在用react hooks即在 React 16 8 中 我在做什么 我创建了一个auth js当用户登录时我存储我的值的文
  • 如何告诉plugman我想要更新一个可能不存在的文件?

    我编写了一个 Android PhoneGap 3 插件 它启动一个 Activity 该 Activity 是插件的一部分 并使用本机 Android UI 现在我想遵循插件规范 http docs phonegap com en 3 0
  • Hubot Slack 机器人可以存储会话吗

    我正在尝试实现简单的松弛机器人 所以我已经配置了hubot这将从以下位置获取输入slack并将其传递给我的网络应用程序 django app 并且它将采取任何响应django app并会回复松弛 在此过程中 我尝试将会话存储在django
  • 使用任务库的 Amazon S3 异步上传

    我有一个将文件上传到 Amazon S3 的 Windows 表单 我尝试实现内置的异步方法 但似乎工作不正常 所以我认为最好的方法是实现 System Threading Tasks 我的实际代码如下所示 public void Uplo
  • 删除 JAX-WS SOAP 响应中的元素

    我有以下 JAX WS 方法 public School createUpdateSchool Perks reqeustData DataHandler contentData 在我的 SOAP 响应中
  • 我可以免受 SQL 注入攻击吗?

    我使用一个简单的 cms 作为我的网站的后端 我可以在其中更新新闻等 我希望避免 SQL 注入 所以我想知道这段代码是否被认为是安全的 或者我是否可以采取一些措施使其更安全 if POST if isset POST title and i
  • C++如何从包含的类中调用父类方法?

    我试图从包含的对象调用父类方法 但以下代码没有成功 标准的做法是什么 我四处搜索 这似乎适用于继承的对象 但不适用于包含的对象 甚至将其称为 父类 是否正确 或者它被称为 Owner 类 class Parent private Child
  • 将两列 Pandas 数据框转换为以第一列作为键的列表字典

    我有以下数据框 import pandas as pd df pd DataFrame ClusterID 1 2 2 1 3 Genes foo qux bar cux fii 看起来像这样 ClusterID Genes 0 1 foo
  • C# 读取包含不同编码字符的 XML 时出现问题

    我在读取 XML 时遇到了问题 解决办法已经找到了 但是还有一些问题 不正确的 XML 文件采用 UTF 8 编码 并且在其标头中具有适当的标记 但它还包含一个以 UTF 16 编码的字符 此代码用于读取 XML 文件以验证其内容 var