我希望使用ConfigurationBuilder读取XML文件,但我一直收到“不支持XML名称空间”错误。有没有办法忽略命名空间?我对.net还是很陌生,所以请保持警惕!
我正在尝试使用ConfigurationBuilder从XML文件中检索连接字符串,以便访问云表(不幸的是,这是一个服务结构应用程序,它必须是XML文件)-当我工作正常时,将其配置为一个“ appsetting.json”文件,但是由于其他人设置了部署配置的方式,因此需要对此进行更改。
XML遵循通常的模式,例如:
<?xml version="1.0" encoding="utf-8" ?>
<Settings xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2011/01/fabric">
.... etc。
我正在使用的代码如下:
string path = Path.Combine(FabricRuntime.GetActivationContext().GetConfigurationPackageObject("Config").Path);
IConfiguration cloudTableConfig2 = new ConfigurationBuilder()
.SetBasePath(path)
.AddXmlFile("Settings.xml", optional: true, reloadOnChange: true)
.Build();
“ GetConfigurationPackageObject”基本上只是为了建立指向设置文件的正确路径,然后将其传递给“配置”构建器。
我希望它与appsettings.json类似,因为我可以用与以下类似的方式从配置中解析所需的值:
IConfiguration cloudTableConfig = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.Build();
// Retrieve the storage account from the connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(cloudTableConfig["RequiredAzureTable:AzureConnectionString"]);
但是,这不起作用,因为在ConfigurationBuilder阶段出现以下异常:
System.FormatException: 'XML namespaces are not supported. Line 2, position 11.'
我无法真正删除名称空间,因为它是一个外部配置的文件。有没有一种简单的方法可以告诉AddXmlFile方法忽略名称空间?还是只能通过扩展AddXmlFile方法真正完成? (或者更确切地说,将扩展方法放在IConfiguration上,该方法围绕AddXmlFile方法?)
答案 0 :(得分:1)
名称空间错误被硬编码为遇到的任何名称空间。而且方法是id name DateFrom DateTo
2 Music Event A 2019-01-24 2019-01-29
3 Music eventB 2019-01-25 2019-01-30
,因此现在有方法可以简单地覆盖它们。
我认为您需要自己阅读xml并处理所需的属性。如果它是来自外部来源的自定义格式文件,则无论如何我都不会在没有额外验证的情况下读取它。
如果文件包含许多不容易事先知道的不同属性,则可能值得编写自己的xml配置提供程序。但我会尽量避免这种情况,并尽可能采用简单的硬编码方法。
答案 1 :(得分:0)
原来我太复杂了。鉴于它是Service Fabric,我只需要输入以下内容即可:
var azureConfig = FabricRuntime.GetActivationContext().GetConfigurationPackageObject("Config");
从那里开始,这只是检索连接字符串的一种简单情况(请注意:可以将它们组合成一个!为简单起见,请保留它们):
var azureConfigSection = azureConfig.Settings.Sections["*SomeSectionName*"];
var azureDataTableConnectionString = azureConfigSection.Parameters["*ConnectionStringNameWithinSection*"].Value;
这使我可以执行以下操作:
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(azureDataTableConnectionString);