在C#中加载XML文件路径

时间:2013-11-13 15:14:35

标签: c# .net xml visual-studio-2012 path

我正在尝试加载位于项目文件夹中的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文件?

7 个答案:

答案 0 :(得分:13)

当VS运行程序时,您的工作目录将设置为Debug / Release文件夹,而不是解决方案根目录。

我知道几个选项......

  1. 使用绝对路径,但您不需要此
  2. 将您的文件设置为在构建时复制到您的工作目录中。您可以通过在解决方案资源管理器中修改文件的属性来执行此操作。 感谢T.Roland在下面的评论中:将复制到输出目录设置为复制如果更新并将构建操作设置为嵌入式资源;
  3. 修改您的解决方案的工作目录以成为您的解决方案根This thread提供了不同的方法来实现它。

答案 1 :(得分:4)

我遇到了同样的问题,并使用&#34; Server.MapPath&#34;

解决了这个问题

例如,

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

XDocument document = XDocument.Load(path);

希望它有所帮助。

答案 2 :(得分:2)

在Visual Studio中为AppValues.xml打开属性。将“复制到输出目录”更改为“如果更新则复制”,并构建项目。

答案 3 :(得分:0)

检查这个

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

答案 4 :(得分:0)

将xml文件的构建操作设置为“Embedded resource”,然后使用此代码

进行引用
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");

答案 5 :(得分:0)

将文件添加到Visual Studio项目时,默认情况下不会将其复制到生成的输出中。因此,您需要设置为复制文件或手动执行此操作。

要将文件设置为自动复制,请在解决方案资源管理器中选择该文件,右键单击并选择属性。将“复制到输出目录”的值更新为“始终复制”。这将确保文件的副本在运行时在生成的解决方案的子文件夹中可用。

然后您可以使用以下内容加载文件:

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

答案 6 :(得分:0)

我分两步解决了。我使用的是MVC,我不得不在类文件中使用它。

1)字符串路径

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

2)更改XML文件属性

构建行动:内容
复制到输出目录:始终复制