Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET核心中的数组';s的XML配置提供程序_Xml_Asp.net Core_.net Core - Fatal编程技术网

ASP.NET核心中的数组';s的XML配置提供程序

ASP.NET核心中的数组';s的XML配置提供程序,xml,asp.net-core,.net-core,Xml,Asp.net Core,.net Core,我正在编写的ASP.NET核心(2.1)应用程序使用两个配置源:JSON和XML(使用框架的标准AddJsonFile和AddXmlFile。XML设置具有更高的优先级(例如,应该覆盖JSON文件中的匹配设置) 到目前为止,一切正常,直到我必须在XML文件中创建一个数组为止。这可能吗?参考 Bind支持使用配置键中的数组索引将数组绑定到对象。任何公开数字键段(:0,:1,…:{n})的数组格式都可以绑定到POCO类数组 我将提供两个如何在XML配置文件中使用数组的示例 使用以下config.xm

我正在编写的ASP.NET核心(2.1)应用程序使用两个配置源:JSON和XML(使用框架的标准
AddJsonFile
AddXmlFile
。XML设置具有更高的优先级(例如,应该覆盖JSON文件中的匹配设置)

到目前为止,一切正常,直到我必须在XML文件中创建一个数组为止。这可能吗?

参考

Bind
支持使用配置键中的数组索引将数组绑定到对象。任何公开数字键段(
:0
:1
,…
:{n}
)的数组格式都可以绑定到POCO类数组

我将提供两个如何在XML配置文件中使用数组的示例

使用以下
config.xml

遵循文件中规定的公约

因此,在下面的单元测试中,它将按预期通过

[TestClass]
公共类配置\u应该{
[测试方法]
public void Bind_Xml_数组(){
var config=new ConfigurationBuilder()
.SetBasePath(目录.GetCurrentDirectory())
.AddXmlFile(“config.xml”,可选:true,重载更改:true)
.Build();
var tvShow=config.GetSection(“tvShow”).Get();
tvShow.Should().NotBeNull();
tvShow.Actors.Should().HaveCount(3);
}
}
在另一个示例中,假设
config.xml
被修改为以下内容

<?xml version="1.0" encoding="utf-8" ?> 
<configuration>
  <tvshow>
    <metadata>
      <series>Dr. Who</series>
      <title>The Sun Makers</title>
      <airdate>11/26/1977</airdate>
      <episodes>4</episodes>
    </metadata>
    <actors>
      <names name="0">Tom Baker</names>
      <names name="1">Louise Jameson</names>
      <names name="2">John Leeson</names>
    </actors>
    <legal>(c)1977 BBC https://www.bbc.co.uk/programmes/b006q2x0</legal>
  </tvshow>
</configuration>
同样,按照约定,数组元素的路径需要如下所示

tvshow:actors:names:0
tvshow:actors:names:1
tvshow:actors:names:2
在测试时,其行为也符合预期

[TestClass]
公共类配置\u应该{
[测试方法]
public void Bind_Xml_数组(){
var config=new ConfigurationBuilder()
.SetBasePath(目录.GetCurrentDirectory())
.AddXmlFile(“config.xml”,可选:true,重载更改:true)
.Build();
var tvShow=config.GetSection(“tvShow”).Get();
tvShow.Should().NotBeNull();
tvShow.Actors.Names.Should().HaveCount(3);
}
}

这一点,以及文档应该为您正确地构造XML配置绑定到数组提供足够的基础。

< P>可以通过添加多个带有数组的重复名称的标签来实现数组行为,其中包含“数组中的索引”的代码>代码>名称>代码>属性。。例如,此json的xml等价物

{
  "Values": [
    "value1",
    "value2",
    "value3"
  ],
  "Users": [
    {
      "Login": "log1",
      "Pass": "pass1"
    },
    {
      "Login": "log2",
      "Pass": "pass2"
    }
  ]
}

但它不是一个完整的asnwer

这种方法有一个严重的缺点。在发布这个答案之前,我测试了xml配置如何与第三方库一起工作。我尝试将json配置转换为xml for
Serilog
。这个json

//..
"WriteTo": [
  { "Name": "Console" }
]
//..
皈依

//..
<WriteTo name="0">
  <Name>Console</Name>
</WriteTo>
//...
/。。
安慰
//...
在这一点上出现了一个例外

System.FormatException:'找到重复的键'WriteTo:0:Name'。第11行,位置11'

还记得来自xml
ConfigurationProvider
的额外条目吗?好吧,现在一切都因为它们而崩溃了。因此结论是,如果json数组的对象包含
Name
key,则无法将其转换为xml

一些好消息


有一个允许使用重复名称的标签而没有<代码>名称< /Cord>属性。这应该修复这个缺点。还有一个是您可以在您的项目中使用的同一个代码< <代码> XmlConfigurationProvider <代码>。这是非常不幸的。正如我在回答中提到的,使用自定义<从github中取消>配置提供程序,或者,如果您迫切需要使用xml配置,您可以推出自己的实现。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <Values name="0">value1</Values>
  <Values name="1">value2</Values>
  <Values name="2">value3</Values>
  <Users name="0">
    <Login>log1</Login>
    <Pass>pas1</Pass>
  </Users>
  <Users name="1">
    <Login>log2</Login>
    <Pass>pas2</Pass>
  </Users>
</configuration>
public class Configuration
{
    public List<string> Values { get; set; }

    public List<User> Users { get; set; }

}

public class User
{
    public string Login { get; set; }

    public string Pass { get; set; }
}

//this code returns the same result for every configuration
var config = new Configuration();
_configuration.Bind(config);

string value = _configuration.GetValue<string>("Values:0");
string login = _configuration.GetValue<string>("Users:0:Login");
//..
"WriteTo": [
  { "Name": "Console" }
]
//..
//..
<WriteTo name="0">
  <Name>Console</Name>
</WriteTo>
//...