Путь сдодержит недопустимы знаки при обращении в ресурсы

Рейтинг: -1Ответов: 1Опубликовано: 09.01.2023

В коде подключаю xml файл к программе

XDocument.Load(Properties.Resources.users);

(где 'users' - название xml дока).

И получаю ошибку: System.ArgumentException: "Путь содержит недопустимые знаки."

Ответы

▲ 1Принят

Когда вы добавляете файл в ресурсы проекта, его содержимое попадает в одноимённое свойство как текст. Иными словами, ваш Properties.Resources.users содержит текст XML документа, в то время как метод XDocument.Load ожидает путь к файлу. Отсюда и ошибка, тот самый недопустимый знак из сообщения об ошибке - это <.

Проще всего будет исправить ошибку заменив Load на Parse:

XDocument.Parse(Properties.Resources.users);

Однако, в таком случае вам придётся внимательно следить за кодировкой файла, потому что такой способ чтения не совсем корректен. Кодировка XML стандартно указывается в директиве <?xml, а автогенерированный код по умолчанию считывает всё в кодировке по умолчанию.

Поэтому правильный способ считать XML из ресурсов требует, чтобы вы изменили в настройках ресурсов проекта способ представления файла со строкового на бинарный. В таком случае ваш Properties.Resources.users станет массивом байт. и сможет быть считан следующим способом:

XDocument.Load(new MemoryStream(Properties.Resources.users));

Отмечу, что этот способ не устраняет проблему с кодировками, а просто позволяет указать правильную кодировку в самом файле.


Наконец, если вам хочется избежать копирования данных в промежуточный массив байт, есть смысл читать из потока напрямую. К сожалению, стандартный кодогенератор "уговорить" отдать вам поток не получится, поэтому придётся проигнорировать созданное им свойство и залезть напрямую в ResourceManager:

XDocument.Load(Properties.Resources.ResourceManager.GetStream("users", Properties.Resources.Culture));