it-roy-ru.com

Загрузка пути к файлу 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(@"\service\AppValues.xml");
    [...]
}

Что дает следующую ошибку, когда я пытаюсь проверить код: 

Test method PandaTests.ServiceTest.ReadXmlCanReadXml threw exception: 
System.IO.DirectoryNotFoundException: Could not find a part of the path 
'C:\Users\MyName\Documents\GitHub\project\Project22\PandaTests\bin\Debug\service\AppValues.xml'.

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

8
Tobias Roland

Когда VS запускает вашу программу, ваш рабочий каталог устанавливается в папку Debug/Release, а не в корневой каталог вашего решения. 

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

  1. Используйте абсолютный путь, но вы не хотите этого 
  2. Установите свой файл для копирования в ваш рабочий каталог при сборке. Это можно сделать, изменив свойства файла в обозревателе решений. Спасибо T.Roland в комментариях ниже: установите Copy to Output Directory для копирования, если новее и установите Build Action для Embedded Resource;
  3. Измените рабочий каталог вашего решения, чтобы он был корневым для вашего решения Этот поток предлагает различные способы сделать это. 
12
Tyler Lee

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

Например,

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

XDocument document = XDocument.Load(path);

Надеюсь, поможет.

4
Sarath Rachuri

Откройте свойства в Visual Studio для AppValues.xml. Измените «Копировать в выходной каталог» на «Копировать, если новее», и постройте проект.

1
jlew

проверь это 

XDocument document = XDocument.Load(@"..\service\AppValues.xml");
0
K3rnel31

Я решил это в 2 шага. Я использую MVC, и мне пришлось использовать это в файле класса.

1) Струнный путь

=HttpContext.Current.Server.MapPath("~/App_Data/yourxmlfilename.xml");
XDocument doc = XDocument.Load(path);

2) Изменить свойства файла XML

Действие построения: содержание
Копировать в выходной каталог: всегда копировать

0
M. Bhavani

Установите действие по сборке 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");
0
guymid

При добавлении файла в проект Visual Studio по умолчанию он не копируется в сгенерированный вывод. Таким образом, вам нужно либо скопировать файл, либо сделать это вручную.

Чтобы настроить автоматическое копирование файла, выберите его в обозревателе решений, щелкните правой кнопкой мыши и выберите «Свойства». Обновите значение «Копировать в выходной каталог» на «Копировать всегда». Это обеспечит доступность копии файла во время выполнения в подпапке результирующего решения.

Затем вы можете загрузить файл, используя что-то вроде:

string path = System.Io.Path.Combine(Application.StartupPath, @"\service\AppValues.xml");
XDocument doc = XDocument.Load(path);
0
Kami