Загрузка пути к 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, а не в корень решения.

У вас есть несколько вариантов, которые я знаю...

  1. использовать абсолютный путь, но вы не хотите этого
  2. установите файл для копирования в рабочий каталог при сборке. Это можно сделать, изменив свойства файла в обозревателе решений. спасибо T. Roland в комментариях ниже: Set копировать в выходной Каталог копировать, если новее и установить Создать Действие к встроенному ресурсу;
  3. измените рабочий каталог вашего решения, чтобы быть вашим корнем решения этой теме предлагает различные способы достижения этого.

я столкнулся с той же проблемой и решил ее с помощью "Server.MapPath"

например,

string path=Server.MapPath("~/service/AppValues.xml");

XDocument document = XDocument.Load(path);

надеюсь, что это помогает.


вызовите свойства в Visual Studio для AppValues.XML. Измените "копировать в выходной каталог "на" копировать, если новее " и создайте проект.


проверить это

XDocument document = XDocument.Load(@"..\service\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
Копировать в выходной каталог: копировать всегда