2016-09-17 41 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