2016-09-17 99 views
2

我是網絡編程新手,決定從.net 4.5切換到.net核心。如何讀取MVC內核中的xml文檔(1.0.0)?

我的項目在以下位置的靜態XML文檔:

的wwwroot /國家/ EN-GB.xml

一個會如何在指定的路徑讀取XML文件?最終我會將數據轉換爲SelectList。

在.net 4.5中我使用了DataSet和HttpConext ... MapPath讀取不再在覈心mvc中工作的xml文檔。

任何意見是非常歡迎。

回答

5

首先不要將您的數據源放到wwwroot文件夾中,因爲它是公開的。看看official docs

您的應用程序的Web根目錄是像CSS,JS和圖像文件公開, 靜態資源在你的項目目錄。靜態文件 中間件默認情況下只會提供Web根目錄(和 子目錄)中的文件。

所以移動Countries文件夾在您的項目的根文件夾中。

要讀取xml數據,您可以使用XmlSerializer。我會盡量展示如何讀取XML文件:

首先,我假定你有XML內容象下面這樣:

<?xml version="1.0" encoding="UTF-8" ?> 
<Container> 
    <Countries> 
    <Country> 
     <Code>Code1</Code> 
     <Title>Title1</Title> 
    </Country> 

    <Country> 
     <Code>Code2</Code> 
     <Title>Title2</Title> 
    </Country> 
    </Countries> 
</Container> 

首先描述類型

public class Country 
{ 
    public string Code { get; set; } 
    public string Title { get; set; } 
} 
public class Container 
{ 
    public Country[] Countries { get; set; } 
} 

之後創建XML序列化服務:

public interface ICountryService 
{ 
    Country[] GetCountries(); 
} 
public class CountryService : ICountryService 
{ 
    private readonly IHostingEnvironment _env; 
    public CountryService(IHostingEnvironment env) 
    { 
     _env = env; 
    } 
    public Country[] GetCountries() 
    { 
     XmlSerializer ser = new XmlSerializer(typeof(Container)); 
     FileStream myFileStream = new FileStream(_env.ContentRootPath + "\\Countries\\en-GB.xml", FileMode.Open); 
     return ((Container)ser.Deserialize(myFileStream)).Countries; 
    } 
} 

然後註冊服務在ConfigureServices方法:

public void ConfigureServices(IServiceCollection services) 
    { 
     // ... 
     services.AddSingleton<ICountryService, CountryService>(); 
    } 

最後注入和在任何地方使用它(如控制器)

public class SomeController : Controller 
{ 
    public SomeController(ICountryService countryService) 
    { 
     // use it 
    } 
} 
+0

真正偉大的,詳細的解答。您的解決方案工作完美我花了幾次嘗試去理解爲什麼出現錯誤,但是這是因爲我的xml數據結構,但現在很明顯。我非常感謝你的時間提供全面的答案。 – RobHurd

+0

如果您不使用早期版本的asp.net中的屬性,這是一個很好的答案。我使用屬性將屬性映射到數據成員。我如何在覈心中完成這項工作? – phitch