9

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

4

7 回答 7

16

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

你有几个我知道的选择......

  1. 使用绝对路径,但你不想要这个
  2. 将您的文件设置为在构建时复制到您的工作目录中。您可以通过在解决方案资源管理器中修改文件的属性来完成此操作。 感谢 T.Roland 在下面的评论中:将Copy to Output Directory设置为 Copy if Newer 并将Build Action设置为 Embedded Resource;
  3. 将您的解决方案的工作目录修改为您的解决方案根此线程提供了不同的方法来完成此操作。
于 2013-11-13T15:20:31.867 回答
4

我遇到了同样的问题并使用“Server.MapPath”解决了它

例如,

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

XDocument document = XDocument.Load(path);

希望能帮助到你。

于 2015-02-26T10:11:43.063 回答
2

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

于 2013-11-13T15:20:48.817 回答
0

将 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");
于 2013-11-13T15:25:12.120 回答
0

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

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

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

string path = System.Io.Path.Combine(Application.StartupPath, @"\service\AppValues.xml");
XDocument doc = XDocument.Load(path);
于 2013-11-13T15:28:09.963 回答
0

检查这个

XDocument document = XDocument.Load(@"..\service\AppValues.xml");
于 2013-11-13T15:20:39.607 回答
0

我分两步解决了。我正在使用 MVC,我必须在类文件中使用它。

1) 字符串路径

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

2) 更改 XML 文件属性

构建操作:内容
复制到输出目录:始终复制

于 2017-06-21T14:39:57.453 回答