Как убрать лишние символы в xml-файле?

Исключение:

Знак ".", шестнадцатеричное значение 0x00, не может стоять в начале имени, строка 1, позиция 2.

Код:

string content = File.ReadAllText(_xml_file);
XDocument doc = XDocument.Parse(content);
...

Штуки типа SanitizeXmlString из https://seattlesoftware.wordpress.com/2008/09/11/hexadecimal-value-0-is-an-invalid-character/ не помогают — портится xml-строка.

Файл по типу такого:

<?xml version="1.0" encoding="UTF-8"?>
<protocol name="protocol" date_time="2024-08-16T13:14:00" description="Test">
    <check name="check1" description="RegularCTCheck" check_datetime="2024-08-16T13:14:00">
        <header stationname="" type="" number="" />
        <param standard="GOST" I1ном="" I2ном="" S2ном="" Rном="" Tизм="" Tном="" Ukn="" Ikn="" />
        <result MagPercent="6.0%" Rизм="9.900 Ом" Rприв="9.900 Ом" Rпогр="0.0%" Ukn="156.452 В" Ikn="0.123237 А" Ukn2="0.000 В" Ikn2="0.000000 А" Ktr="1002.4" KtrPogr="0.0%" Ph="-176.6°" Pol="Negative" />
        <VAC entriescount="13">
            <VACentry number="1" Uизм="82.68 В" Iизм="1.5866 А" P="141.25824 Вт" U50Hz="82.6777 В" I50Hz="1.5866 А" />
            <VACentry number="2" Uизм="82.19 В" Iизм="1.5148 А" P="128.75563 Вт" U50Hz="82.1941 В" I50Hz="1.5148 А" />
            ...
        </VAC>
    </check>
</protocol>

введите сюда описание изображения

И еще : введите сюда описание изображения


Ответы (1 шт):

Автор решения: Yitzhak Khabinsky

Предположение, что это так называемый Byte Order Mark (BOM) создаёт проблему.

void Main()
{
    string _xml_file = @"...";
    string content = File.ReadAllText(_xml_file);

    string _byteOrderMarkUtf8 = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
    
    if (content.StartsWith(_byteOrderMarkUtf8, StringComparison.Ordinal))
    {
        content = content.Remove(0, _byteOrderMarkUtf8.Length);
    }
    
    XDocument doc = XDocument.Parse(content);
}

Вот как выглядит BOM в начале XML-файла:

BOM

→ Ссылка