【问题标题】:Hexadecimal value 0x00 is a invalid character loading XML document十六进制值 0x00 是加载 XML 文档的无效字符
【发布时间】:2014-10-12 22:17:22
【问题描述】:

我最近有一个无法加载的 XML。错误消息是

十六进制值 0x00 是无效字符

由 LinqPad 中的最少代码接收(C# 语句):

var xmlDocument = new XmlDocument();
xmlDocument.Load(@"C:\Users\Thomas\AppData\Local\Temp\tmp485D.tmp");

我使用十六进制编辑器浏览了 XML,但找不到 0x00 字符。我将 XML 最小化为

<?xml version="1.0" encoding="UTF-8"?>
<x>
</x>

在我的十六进制编辑器中显示为

Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000  FF FE 3C 00 3F 00 78 00 6D 00 6C 00 20 00 76 00  ÿþ<.?.x.m.l. .v.
00000010  65 00 72 00 73 00 69 00 6F 00 6E 00 3D 00 22 00  e.r.s.i.o.n.=.".
00000020  31 00 2E 00 30 00 22 00 20 00 65 00 6E 00 63 00  1...0.". .e.n.c.
00000030  6F 00 64 00 69 00 6E 00 67 00 3D 00 22 00 55 00  o.d.i.n.g.=.".U.
00000040  54 00 46 00 2D 00 38 00 22 00 3F 00 3E 00 0D 00  T.F.-.8.".?.>...
00000050  0A 00 3C 00 78 00 3E 00 0D 00 0A 00 3C 00 2F 00  ..<.x.>.....<./.
00000060  78 00 3E 00                                      x.>.

所以很容易看出任何地方都没有00 00 字符。所有偶数列都包含除00 之外的值。

为什么会抱怨无效的 0x00 字符?

【问题讨论】:

标签: c# xml byte-order-mark


【解决方案1】:

问题在于编码。字节顺序标记FF FE 用于UTF-16,但XML 标头定义encoding="UTF-8"

如果您自己生成 XML,有两种选择:

a) 写一个 UTF-8 标头:EF BB BF

b) 定义 UTF-16 编码:encoding="UTF-16"

如果您从其他人那里收到 XML,还有两种选择:

A) 告诉作者根据 a) 或 b) 修复 XML

B) 清理应用程序中的输入(不是首选)

【讨论】:

  • +1。另一种加载方式 - 首先读取为字符串,然后从字符串加载 XML(因为在这种情况下解析器将忽略编码)。
  • @AlexeiLevenkov 你的老套路对我不起作用。我在做一个 XDocument.Parse(data.getstring("datafieldname") 并且它正在产生十六进制错误。
  • @Mike 您应该提出单独的问题,显示您的特定案例的minimal reproducible example(链接到此帖子将“显示研究成果”)。看看这个问题如何展示“最少”数据来重现问题并考虑在你的新问题中做类似的事情。
猜你喜欢
  • 2012-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 2016-11-14
  • 2016-03-30
  • 1970-01-01
相关资源
最近更新 更多