我是网络编程的新手,决定从.net 4.5切换到.net核心。
我的项目在以下位置有一个静态xml文档:
的wwwroot /国家/ EN-GB.xml
如何在指定的路径上读取xml文件?最终我将数据转换为SelectList。
在.net 4.5中我使用了DataSet和HttpConext ... MapPath来读取不再适用于核心mvc的xml文档。
非常欢迎任何建议。
答案 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
}
}