如何在MVC核心(1.0.0)中读取xml文档?

时间:2016-09-17 22:51:31

标签: asp.net-core asp.net-core-mvc asp.net-core-1.0

我是网络编程的新手,决定从.net 4.5切换到.net核心。

我的项目在以下位置有一个静态xml文档:

  

的wwwroot /国家/ EN-GB.xml

如何在指定的路径上读取xml文件?最终我将数据转换为SelectList。

在.net 4.5中我使用了DataSet和HttpConext ... MapPath来读取不再适用于核心mvc的xml文档。

非常欢迎任何建议。

1 个答案:

答案 0 :(得分:5)

首先,请不要将您的数据源放入wwwroot文件夹,因为它是公开提供的。看看official docs

  

您应用的网络根目录是项目中的公共目录,   静态资源,如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
    }
}