2010-06-17 116 views
4

我是LINQtoXML中的新成员。我想使用XElement.Load(“”)方法。但编译器无法找到我的文件。你能帮我写出我的XML文件的正确路径吗? 请注意:我在App_Code中定义了一个类,我想在其中一个方法中使用XML文件数据,并且我的XML文件位于App_Data中。
XElement.Load(“〜/ App_Data/file.xml”)找不到路径的一部分

settings = XElement.Load("App_Data/AppSettings.xml"); 

我不能使用Request.ApplicationPathPage.MapPath()Server.MapPath(),因为我在一个类继承的形式Page类是无法得到的物理路径为我的文件。

简短的错误消息:
找不到路径 'C:\ Program Files文件\微软的Visual Studio 9.0 \ Common7 \ IDE \ App_Data文件\ AppSettings.xml' 的一部分

看到编译的路径是从我的项目路径完全不同的(G:\ MyProjects下\ ASP.net项目\ VistaComputer \网站\ App_Data文件\ AppSettings.xml)

完整的错误信息是在这里:

System.IO.DirectoryNotFoundException was unhandled by user code 
    Message="Could not find a part of the path 'C:\\Program Files\\Microsoft Visual Studio 9.0\\Common7\\IDE\\App_Data\\AppSettings.xml'." 
    Source="mscorlib" 
    StackTrace: 
     at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 
     at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) 
     at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize) 
     at System.Xml.XmlDownloadManager.GetStream(Uri uri, ICredentials credentials) 
     at System.Xml.XmlUrlResolver.GetEntity(Uri absoluteUri, String role, Type ofObjectToReturn) 
     at System.Xml.XmlReader.Create(String inputUri, XmlReaderSettings settings, XmlParserContext inputContext) 
     at System.Xml.XmlReader.Create(String inputUri, XmlReaderSettings settings) 
     at System.Xml.Linq.XElement.Load(String uri, LoadOptions options) 
     at System.Xml.Linq.XElement.Load(String uri) 
     at ProductActions.Add(Int32 catId, String title, String price, String website, String shortDesc, String fullDesc, Boolean active, Boolean editorPick, String fileName, Stream image) in g:\MyProjects\ASP.net Projects\VistaComputer\Website\App_Code\ProductActions.cs:line 67 
     at CMS_Products_Operations.Button1_Click(Object sender, EventArgs e) in g:\MyProjects\ASP.net Projects\VistaComputer\Website\CMS\Products\Operations.aspx.cs:line 72 
     at System.Web.UI.WebControls.Button.OnClick(EventArgs e) 
     at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) 
     at System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) 
     at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) 
     at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) 
     at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
    InnerException: 

回答

12

你可以尝试HostingEnvironment.ApplicationPhysicalPath静态属性(假设这在ASP.NET应用程序使用):

string filePath = Path.Combine(
    HostingEnvironment.ApplicationPhysicalPath, 
    @"App_Data\AppSettings.xml" 
); 

我不同,恕我直言,更好的方法是编写一个可重复使用的函数,它将文件名作为参数,并在一天结束时从某个WebForm中调用,您将有权访问Server.MapPath。这样做的好处是,该函数不再依赖于ASP.NET引擎,并且可以在其他应用程序中重用,其中文件名的计算方式不同。所以基本上分开的担忧:

  1. 计算文件名的位置
  2. 传递一个文件名,做它
+0

非常感谢你的一些解析功能。很有帮助。 – mahdiahmadirad 2010-06-17 19:38:49

+0

+1谢谢!那正是我想要的。 – devios1 2010-07-02 17:12:59

相关问题