Загрузка пути к XML-файлу в C#
Я пытаюсь загрузить XML-файл, расположенный в папке в моем проекте (с помощью Visual Studio 2012).
структура такая:
solutionRoot
- service
-- ServiceClass.cs
-- AppValues.xml <-- this is the file I want to load
В моем ServiceClass я пытаюсь прочитать из XML-файла со следующим кодом:
public String GetXmlElement(String elementName)
{
[....]
XDocument document = XDocument.Load(@"serviceAppValues.xml");
[...]
}
что дает следующую ошибку, когда я пытаюсь проверить код:
Test method PandaTests.ServiceTest.ReadXmlCanReadXml threw exception:
System.IO.DirectoryNotFoundException: Could not find a part of the path
'C:UsersMyNameDocumentsGitHubprojectProject22PandaTestsbinDebugserviceAppValues.xml'.
это, очевидно, проблема с моим путем, но я не могу понять, как правильно получить относительный путь. Я смотрел на других. вопросы здесь о переполнении стека, но многие из них кажутся чрезмерно вовлеченными. Есть ли простой способ загрузить XML-файл без указания абсолютного пути?
7 ответов
когда VS запускает вашу программу, ваш рабочий каталог установлен в папку Debug/Release, а не в корень решения.
У вас есть несколько вариантов, которые я знаю...
- использовать абсолютный путь, но вы не хотите этого
- установите файл для копирования в рабочий каталог при сборке. Это можно сделать, изменив свойства файла в обозревателе решений. спасибо T. Roland в комментариях ниже: Set копировать в выходной Каталог копировать, если новее и установить Создать Действие к встроенному ресурсу;
- измените рабочий каталог вашего решения, чтобы быть вашим корнем решения этой теме предлагает различные способы достижения этого.
я столкнулся с той же проблемой и решил ее с помощью "Server.MapPath"
например,
string path=Server.MapPath("~/service/AppValues.xml");
XDocument document = XDocument.Load(path);
надеюсь, что это помогает.
вызовите свойства в Visual Studio для AppValues.XML. Измените "копировать в выходной каталог "на" копировать, если новее " и создайте проект.
установите действие сборки xml-файла как "встроенный ресурс", а затем ссылайтесь на этот код
private static UnmanagedMemoryStream GetResourceStream(string resName)
{
var assembly = Assembly.GetExecutingAssembly();
var strResources = assembly.GetName().Name + ".g.resources";
var rStream = assembly.GetManifestResourceStream(strResources);
var resourceReader = new ResourceReader(rStream);
var items = resourceReader.OfType<DictionaryEntry>();
var stream = items.First(x => (x.Key as string) == resName.ToLower()).Value;
return (UnmanagedMemoryStream)stream;
}
var file = GetResourceStream("appValues.xml");
при добавлении файла в проект Visual Studio он по умолчанию не копируется в созданный вывод. Таким образом, вам нужно либо скопировать файл, либо сделать это вручную.
установить файл для автоматического копирования, выберите его в обозревателе решений щелкните правой кнопкой мыши и выберите Свойства. Обновите значение " копировать в выходной каталог "до"копировать всегда". Это гарантирует, что копия файла будет доступна во время выполнения во вложенной папке результирующего решения.
вы тогда можете загрузить файл, используя что-то вроде:
string path = System.Io.Path.Combine(Application.StartupPath, @"\service\AppValues.xml");
XDocument doc = XDocument.Load(path);
Я решил его в 2 шага. Я использую MVC, и мне пришлось использовать это в файле класса.
1) строку пути
=HttpContext.Current.Server.MapPath("~/App_Data/yourxmlfilename.xml");
XDocument doc = XDocument.Load(path);
2) Изменить свойства XML-файла
Build Action: Content
Копировать в выходной каталог: копировать всегда