使用ConfigurationBuilder读取XML文件时如何忽略名称空间

时间:2019-01-28 18:00:25

标签: c# .net xml

我希望使用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方法?)

2 个答案:

答案 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);