web-dev-qa-db-ja.com

16進値0x00は、XMLドキュメントをロードする無効な文字です

最近、ロードされないXMLがありました。エラーメッセージは

16進値0x00は無効な文字です

linqPadの最小限のコードで受信(C#ステートメント):

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

16進エディターでXMLを調べましたが、0x00文字が見つかりませんでした。 XMLを最小化して

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

私の16進エディタでは、次のように表示されます

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文字について文句を言うのはなぜですか?

11
Thomas Weller

問題はエンコーディングにあります。バイトオーダーマークFF FEはUTF-16用ですが、XMLヘッダーはencoding="UTF-8"を定義します。

XMLを自分で生成する場合は、次の2つのオプションがあります。

a)UTF-8ヘッダーを記述します:EF BB BF

b)UTF-16エンコーディングを定義します:encoding="UTF-16"

他の人からXMLを受け取った場合は、次の2つのオプションもあります。

A)a)またはb)に従ってXMLを修正するように作成者に指示します。

B)アプリケーションの入力をサニタイズします(推奨されません)

17
Thomas Weller