十六进制值0x00是加载XML文档的无效字符
本文关键字:文档 无效 字符 XML 加载 0x00 十六进制 | 更新日期: 2023-09-27 18:26:16
我最近有一个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字符无效?
问题出在编码上。字节顺序标记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) 清除应用程序中的输入(不是首选)