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

How to read xml document in MVC core (1.0.0)?

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

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

wwwroot/Countries/en-GB.xml

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

在 .net 4.5 中,我使用 DataSet 和 HttpConext...MapPath 来读取 xml 文档,该文档在核心 mvc 中不再有效。

非常欢迎任何建议。

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

The web root of your app is the directory in your project for public, static resources like css, js, and image files. The static files middleware will only serve files from the web root directory (and sub-directories) by default.

因此,将 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
    }
}