简体   繁体   中英

XML deserialization to object

So i've been trying to deserialize this xml file to some objects, its simple enough but it keeps returning null to the objects, the data that i need is stored inside the attributes of the element.

Here is the XML.

 <exchangerates xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" type="Valutakurser" author="Danmarks Nationalbank" refcur="DKK" refamt="1">
<dailyrates id="2020-10-20">
    <currency code="AUD" desc="Australske dollar" rate="442,98"/>
    <currency code="BGN" desc="Bulgarske lev" rate="380,53"/>
</dailyrates>

And this is the deserialisation code.

public static T DeserializeElement<T>(string filename)
    {
        try
        {
            T result;
            XmlSerializer serializer = new XmlSerializer(typeof(T), new 
            XmlRootAttribute("exchangerates"));
            
            using (TextReader tr = new StringReader(filename))
            {
                result = (T)serializer.Deserialize(tr);
            }

            return result;
        }
        catch { throw; }
    } 

And these are the objects

[XmlRoot(Namespace = "http://www.w3.org/2001/XMLSchema-instance",
ElementName = "exchangerates",
DataType = "Valutakurser")]
[Serializable]
public class Valutakurser
{
    
    [XmlArray("dailyrates")]
    public DateTime Id { get; set; }
    public Currency Currency { get; set; }
}

[Serializable]
public class Currency
{
    public string Code { get; set; }
    public string Desc { get; set; }
    public double Rate { get; set; }

    public Currency() { }
}

Currently I keep getting this error and everything returned null:

InvalidOperationException: For non-array types, you may use the following attributes: XmlAttribute, XmlText, XmlElement, or XmlAnyElement

Try following :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Xml;
using System.Xml.Serialization;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XmlReader reader = XmlReader.Create(FILENAME);
            XmlSerializer serializer = new XmlSerializer(typeof(Valutakurser));
            Valutakurser valutakurser = (Valutakurser)serializer.Deserialize(reader);

        }
    }
    [XmlRoot(ElementName = "exchangerates")]
    public class Valutakurser
    {
        [XmlAttribute]
        public DateTime id { get; set; }
        [XmlElement("dailyrates")]
        public DailyRates DalyRates { get; set; }
    }
    public class DailyRates
    {
        [XmlElement("currency")]
        public List<Currency> Currency { get; set; }
    }

    public class Currency
    {
        [XmlAttribute]
        public string code { get; set; }
        [XmlAttribute]
        public string desc { get; set; }
        [XmlAttribute]
        public double rate { get; set; }

        public Currency() { }
    }

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM