Шестнадцатеричное значение 0x00 - недопустимый символ при загрузке XML-документа.

Недавно у меня был 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?


person Thomas Weller    schedule 12.10.2014    source источник
comment
См. Также здесь stackoverflow.com/ questions / 11036799 /   -  person Matthew Lock    schedule 29.09.2016


Ответы (1)


Проблема в кодировке. Метки порядка байтов FF FE предназначены для UTF-16, но заголовок XML определяет encoding="UTF-8".

Если вы создаете XML самостоятельно, есть два варианта:

а) напишите заголовок UTF-8: EF BB BF

б) определить кодировку UTF-16: encoding="UTF-16"

Если вы получили XML от кого-то еще, есть также два варианта:

A) скажите автору исправить XML в соответствии с a) или b)

Б) очистить ввод в вашем приложении (не рекомендуется)

person Thomas Weller    schedule 12.10.2014
comment
+1. Еще один хитрый способ загрузки - сначала читать как строку, а затем загружать XML из строки (поскольку в этом случае парсер игнорирует кодировку). - person Alexei Levenkov; 13.10.2014
comment
@AlexeiLevenkov Твой хакерский способ мне не помог. Я использую XDocument.Parse (data.getstring (datafieldname), и он выдает шестнадцатеричную ошибку. - person Mike; 16.08.2017
comment
@Mike, вы должны задать отдельный вопрос, показывающий минимальный воспроизводимый пример вашего конкретного случая (ссылка на этот пост покажет исследовательские усилия ). Посмотрите, как этот вопрос продемонстрировал минимальные данные для воспроизведения проблемы, и подумайте о том, чтобы сделать то же самое в своем новом вопросе. - person Alexei Levenkov; 16.08.2017