Search code examples
configurationasp.net-core.net-corexmlserializer

Custom ConfigurationProvider - Parse xml in dotnet core


I'm trying to use an existing settings file as a ConfigurationProvider. Then I need to parse the following xml:

<?xml version="1.0" encoding="utf-8"?>
<parameters>
   <setParameter name="param1" value="val1" />
   <setParameter name="param2" value="val2  />  
</parameters>

I'm having truble understanding how to map this xml to a class. This is what I've tried:

[XmlRoot(elementName:"parameters")]
public class Parameters
{
    [XmlArray]
    public List<setParameter> parameters { get; set; }
}
[XmlRoot]
public class setParameter
{
    [XmlAnyAttribute]
    public string name { get; set; }
    [XmlAnyAttribute]
    public string value { get; set; }
}

And tried reading it as below:

 XmlSerializer ser = new XmlSerializer(typeof(Parameters));
 FileStream myFileStream = new FileStream(_root+"/SetParameters-Development.xml", FileMode.Open);
 var needThisArray = ((Parameters)ser.Deserialize(myFileStream)).parameters;

Thanks for any help

Larsi


Solution

  • Your xml is invalid and thus it cannot be deserialized:

    <?xml version="1.0" encoding="utf-8"?>
    <parameters>
      <setParameter name="param1" value="val1" />
      <setParameter name="param2" value="val2  />  //missing double quote " here 
    </parameters>
    

    but should be: <setParameter name="param2" value="val2" />

    btw you can use: http://xmltocsharp.azurewebsites.net/ to generate valid C# classes for you based on your xml.

    When i add the quotes it creates me the following model i can use to deserialize:

    [XmlRoot(ElementName="setParameter")]
    public class SetParameter {
        [XmlAttribute(AttributeName="name")]
        public string Name { get; set; }
        [XmlAttribute(AttributeName="value")]
        public string Value { get; set; }
    }
    
    [XmlRoot(ElementName="parameters")]
    public class Parameters {
        [XmlElement(ElementName="setParameter")]
        public List<SetParameter> SetParameter { get; set; }
    }