Member 12573720 Ответов: 1

Как преобразовать список в строку XML и XML в список это дает ошибку


public class FeePlanGenerate
 {
     public List<FeePlan> FeePlanList { get; set; }
     public List<FeeComponent> FeeComponentList { get; set; }

     public string StudentName { get; set;}
     public string StudentAddress { get; set; }
     public string CurriculumName { get; set; }
     public string CourseName { get; set; }
     public string BCNumber { get; set; }
     public Nullable< DateTime> AddmissionDate { get; set; }
     public string AddmissionOfficer{ get; set; }
     public string Contant1 { get; set; }
     public string Contant2 { get; set; }
     public string AdmissionCode { get; set; }
     public Nullable< decimal> TotalInvoiceAmount { get; set; }
     public Nullable<decimal> TotalPayableFee { get; set; }
     public string ArrayOfFeePlanGenerate { get; set; }
 }


Что я уже пробовал:

static string ConvertObjectToXMLString(object classObject)
        {
            string xmlString = null;
            XmlSerializer xmlSerializer = new XmlSerializer(classObject.GetType());
            using (MemoryStream memoryStream = new MemoryStream())
            {
                xmlSerializer.Serialize(memoryStream, classObject);
                memoryStream.Position = 0;
                xmlString = new StreamReader(memoryStream).ReadToEnd();
            }
            return xmlString;
        }
        public static FeePlanGenerate LoadFromXMLString(string xmlText)
        {
            XmlRootAttribute xRoot = new XmlRootAttribute();
            xRoot.ElementName = "user";
            // xRoot.Namespace = "http://www.cpandl.com";
            xRoot.IsNullable = true;
            var stringReader = new System.IO.StringReader(xmlText);
            var serializer = new XmlSerializer(typeof(FeePlanGenerate),xRoot);
            return serializer.Deserialize(stringReader) as FeePlanGenerate;
        }

Patrice T

Какое сообщение об ошибке?

Graeme_Grant

Тот, что в названии вопроса... ;)

Patrice T

Возможно :)

Graeme_Grant

"XML to list it gives an error" ... Если это XML-массив, то ошибка очевидна и ответ на нее приведен ниже.

1 Ответов

Рейтинг:
0

Graeme_Grant

В приведенном выше коде отсутствует пара классов, поэтому я не могу полностью проверить, где может быть ошибка или с каким типом ошибки вы сталкиваетесь. Однако я использовал свой собственный код конвертера, и все было преобразовано без ошибок.

Вот что я использовал:

public static class XmlConverter
{
    public static string FromClass<T>(T data)
    {
        string response = string.Empty;

        var ms = new MemoryStream();
        try
        {
            ms = FromClassToStream(data);

            if (ms != null)
            {
                ms.Position = 0;
                using (var sr = new StreamReader(ms))
                    response = sr.ReadToEnd();
            }

        }
        finally
        {
            // don't want memory leaks...
            ms.Flush();
            ms.Dispose();
            ms = null;
        }

        return response;
    }

    public static MemoryStream FromClassToStream<T>(T data, XmlSerializerNamespaces ns = null)
    {
        var stream = default(MemoryStream);

        if (data != null)
        {
            var settings = new XmlWriterSettings()
            {
                Encoding = Encoding.UTF8,
                Indent = true,
                ConformanceLevel = ConformanceLevel.Auto,
                CheckCharacters = true,
                OmitXmlDeclaration = false
            };

            try
            {
                XmlSerializer serializer = XmlSerializerFactoryNoThrow.Create(typeof(T));

                stream = new MemoryStream();
                using (XmlWriter writer = XmlWriter.Create(stream, settings))
                {
                    serializer.Serialize(writer, data, ns);
                    writer.Flush();
                }
                stream.Position = 0;
            }
            catch (Exception)
            {
                stream = default(MemoryStream);
            }
        }
        return stream;
    }

    public static T ToClass<T>(string data)
    {
        var response = default(T);

        if (!string.IsNullOrEmpty(data))
        {
            var settings = new XmlReaderSettings()
            {
                IgnoreWhitespace = true,
                DtdProcessing = DtdProcessing.Ignore
            };

            XmlSerializer serializer = XmlSerializerFactoryNoThrow.Create(typeof(T));

            using (var sr = new StringReader(data))
            using (var reader = XmlReader.Create(sr, settings))
                response = (T)Convert.ChangeType(serializer.Deserialize(reader), typeof(T));
        }
        return response;
    }
}

// ref: http://stackoverflow.com/questions/1127431/xmlserializer-giving-filenotfoundexception-at-constructor/39642834#39642834
public static class XmlSerializerFactoryNoThrow
{
    public static Dictionary<Type, XmlSerializer> cache = new Dictionary<Type, XmlSerializer>();

    private static readonly object SyncRootCache = new object();

    public static XmlSerializer Create(Type type)
    {
        XmlSerializer serializer;

        lock (SyncRootCache)
            if (cache.TryGetValue(type, out serializer))
                return serializer;

        //multiple variable of type of one type is same instance
        lock (type)
        {
            //constructor XmlSerializer.FromTypes does not throw the first chance exception           
            serializer = XmlSerializer.FromTypes(new[] { type })[0];
        }

        lock (SyncRootCache) cache[type] = serializer;
        return serializer;
    }
}

А вот как им пользоваться:
var data = new FeePlanGenerate();
var xmlString = XmlConverter.FromClass(data);

ОБНОВЛЕНИЕ Я только что перечитал название вашего вопроса и увидел, что проблема на самом деле связана со свойствами списка в предоставленном классе.

Ответ зависит от того, как форматируются XML-данные. Я предполагаю, что узлы находятся один под другим, но без просмотра необработанного XML, который вы хотите десериализовать, трудно сказать.

Мое лучшее предположение состояло бы в том, чтобы сделать следующее:
public class FeePlanGenerate
{
    [XmlElement]
    public List<FeePlan> FeePlanList { get; set; }

    [XmlElement]
    public List<FeeComponent> FeeComponentList { get; set; }

    public string StudentName { get; set;}
    public string StudentAddress { get; set; }
    public string CurriculumName { get; set; }
    public string CourseName { get; set; }
    public string BCNumber { get; set; }
    public DateTime? AddmissionDate { get; set; }
    public string AddmissionOfficer{ get; set; }
    public string Contant1 { get; set; }
    public string Contant2 { get; set; }
    public string AdmissionCode { get; set; }
    public decimal? TotalInvoiceAmount { get; set; }
    public decimal? TotalPayableFee { get; set; }
    public string ArrayOfFeePlanGenerate { get; set; }
}