Member 3652617 Ответов: 1

Ошибка чтения XML с UTF-16 в заголовке


У меня есть программа, которая читает xml-файл. Файл дан мне, я его не создаю.

Я использую
using (XmlTextReader reader = new XmlTextReader(Filename))
         {

           while (reader.Read())


и он прекрасно работает, если только xml-файл не имеет
кодировка= " utf-16"
в этом. В таком случае я получаю
Необработанное исключение типа 'System.В формате XML.Xmlexception В' произошел в System.Xml.dll
Дополнительная информация: нет знака порядка байтов в Юникоде. Не удается переключиться на Юникод.

изменение xml-файла на utf-8 работает, но я не хочу каждый раз редактировать этот файл. Есть ли способ исправить это в коде читателя?
полный XML-файл

<?xml version="1.0" encoding="utf-16"?>
<LapSyncData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <DriverData>
    <Driver position="1" name="Bob Smith (1)" carNum="4" laps="4" lapTime="13.88" elapsedTime="55.52" pace="50.00" fastLap="10.83" fastLapOn="3" avgLap="12.50" done="True" DriverID="8b8f1514-75d6-4aaf-b537-fe005d3b16b4" />
  </DriverData>
  <RaceData>
    <Race Version="0.1" className="4S" classID="4ab689ac-67e2-4cdb-bf9a-a0109b8bc7e8" raceStatus="complete" raceLength="4" timeElapsed="58" timeRemaining="0" raceNumber="1" totalRaces="5" round="1" />
  </RaceData>
</LapSyncData>


Что я уже пробовал:

Я попробовал использовать (XmlTextReader reader = new XmlTextReader(Filename, Encoding.GetEncoding ("UTF-8"))) но если это сработает, то я не смогу понять синтаксис.

Kenneth Haugland

Возможно:
http://stackoverflow.com/questions/4520184/how-to-detect-the-character-encoding-of-a-text-file

0x01AA

XML-файл не содержит ByteOrderMark (BOM). Для проверки откройте файл с помощью блокнота и сохраните его как Unicode. Блокнот вставит спецификацию в начало файла.

1 Ответов

Рейтинг:
2

Richard Deeming

Попробуйте использовать StreamReader как источник для вашего XmlTextReader:

using (TextReader file = File.OpenText(Filename))
using (XmlReader reader = XmlReader.Create(file))
{
    ...
}