This is a solution that uses Xlement
to parse the xml provided, note within the method GetMessageFromXml
, the checks for null , the use of FirstOrDefault
and the use of Attributes
`Elements` to pick apart or traverse the xml.
var xml = XElement.Parse(GetXmlToProcess());
var messages = xml.Elements("Message").Select(x=>
{
return GetMessageFromXml(x);
});
//method to parse
public Message GetMessageFromXml( XElement elem)
{
var msg = new Message();
var type = elem.Attributes("type").FirstOrDefault();
msg.Type =type != null? type.Value : null;
var detail =elem.Elements("Details");
if (detail != null)
{
var locale = detail.Attributes("locale").FirstOrDefault();
var messageType = detail.Attributes("message-type").FirstOrDefault();
msg.Details = new Detail()
{
Locale=locale != null? locale.Value: null,
MessageType= messageType != null? messageType.Value: null
};
}
var reciever =elem.Elements("Receiver").FirstOrDefault();
if (reciever != null)
{
msg.Receiver = reciever.Value;
}
var context = elem.Elements("Context");
if (context != null)
{
msg.Context = new Context();
msg.Context.Parameters.AddRange(context.Elements("Parameter").Select(x=>
{
var parameter = new Parameter();
var name = x.Attributes("name").FirstOrDefault();
var value = x.Attributes("value").FirstOrDefault();
parameter.Name = name!= null? name.Value:null;
parameter.Value = value!=null? value.Value:null;
return parameter;
}).ToList());
}
return msg;
}
the classes used
public class Message
{
public string Type{get; set;}
public Detail Details {get; set;}
public Context Context {get; set;}
public string Receiver{get;set;}
}
public class Detail
{
public string Locale{get;set;}
public string MessageType{get;set;}
}
public class Context
{
public List<Parameter> Parameters {get;set;}
public Context()
{
Parameters = new List<Parameter>();
}
}
public class Parameter
{
public string Name {get;set;}
public string Value {get;set;}
}