Reputation: 115
I try serialize xml to my classes:
[XmlRoot(ElementName = "order")]
public class OrderModel
{
[XmlElement(ElementName = "purchaser")]
public CompanyModel Purchaser { get; set; }
[XmlElement(ElementName = "deliverver")]
public CompanyModel Deliverver { get; set; }
[XmlElement(ElementName = "position")]
public List<OrderPositionModel> Positions { get; set; }
}
public class OrderPositionModel
{
[XmlElement(ElementName = "id")]
public int id { get; set; }
[XmlElement(ElementName = "lp")]
public int OrdinalNumber { get; set; }
[XmlElement(ElementName = "name")]
public string Name { get; set; }
[XmlElement(ElementName = "quantity")]
public int Quantity { get; set; }
}
After serialization I get object with good List length, but its elements have empty id, lp, name and quantitiy.
UPDATE serialization method
private object XmlReader(HttpPostedFileBase file, Type type)
{
var document = new XmlDocument();
document.Load(file.InputStream);
string stream = document.OuterXml;
StringReader strReader = null;
XmlSerializer serializer = null;
XmlTextReader xmlReader = null;
Object obj = null;
try
{
strReader = new StringReader(stream);
serializer = new XmlSerializer(type);
xmlReader = new XmlTextReader(strReader);
obj = serializer.Deserialize(xmlReader);
}
catch (Exception)
{
//Handle Exception Code
}
finally
{
if (xmlReader != null)
{
xmlReader.Close();
}
if (strReader != null)
{
strReader.Close();
}
}
return obj;
}
Something like this, then I add using block
UPDATE#2 I try this xml
<order>
<purchaser>
<name>name1</name>
<address>address1</address>
</purchaser>
<deliverver>
<name>name2</name>
<address>address2</address>
</deliverver>
<position id="17" name="pos1" lp="1" quantity="1"/>
<position id="21" name="pos2" lp="2" quantity="2"/>
</order>
Upvotes: 1
Views: 1133
Reputation: 1
Try serializing that way, it works for me
Example of using the class "ObjectSerialization"
try
{
parmExtRoute viagens = new parmExtRoute();
Stream streamXml = arquivoRecebido.InputStream;
var document = new XmlDocument();
document.Load(streamXml);
string stream = document.OuterXml;
viagens = ObjectSerialization.DeserializeObject<parmExtRoute>(stream);
retorno.Result = viagens;
}
catch (Exception ex)
{
retorno.ListErrors.Add(ex.Message);
}
return retorno;
public static class ObjectSerialization
{
public static string SerializeObject<T>(T dataObject)
{
if (dataObject == null)
return string.Empty;
try
{
using (var stringWriter = new StringWriter())
{
var namespaces = new XmlSerializerNamespaces();
var settings = new XmlWriterSettings();
settings.Encoding = new UnicodeEncoding(false, false);
settings.Indent = false;
settings.NewLineChars = string.Empty;
settings.NewLineHandling = NewLineHandling.None;
settings.OmitXmlDeclaration = true;
namespaces.Add(string.Empty, string.Empty);
var serializer = new XmlSerializer(typeof(T));
using (var xmlWriter = XmlWriter.Create(stringWriter, settings))
serializer.Serialize(xmlWriter, dataObject, namespaces);
return stringWriter.ToString();
}
}
catch (Exception ex)
{
Console.WriteLine(string.Format("Erro ao serializar objeto. ", ex.Message) + DateTime.Now.ReturnDateLocale());
return string.Empty;
}
}
public static T DeserializeObject<T>(string xml) where T : class
{
if (string.IsNullOrEmpty(xml))
return Activator.CreateInstance<T>();
try
{
using (var stringReader = new StringReader(xml))
{
var serializer = new XmlSerializer(typeof(T), new Type[] { typeof(T) }); ;
return (T)serializer.Deserialize(stringReader);
}
}
catch (Exception ex)
{
Console.WriteLine(string.Format("Erro ao deserializar objeto. ", ex.Message) + DateTime.Now.ReturnDateLocale());
return Activator.CreateInstance<T>();
}
}
public static string ObjectParamWs<T>(T dataObject)
{
string conteudo = SerializeObject<T>(dataObject);
string xml = conteudo;
return xml;
}
}
Upvotes: 0
Reputation: 16662
Simplest working example:
Note that some of your properties were decorated with XMLElement
while they're attributes and therefore should be decorated with XMLAttribute
instead.
(I've also removed all of what was unnecessary)
using System.Collections.Generic;
using System.Xml;
using System.Xml.Serialization;
namespace ConsoleApplication1
{
internal class Program
{
private static void Main(string[] args)
{
var filename = @"..\..\XMLFile1.xml";
var model = Read(filename);
}
private static OrderModel Read(string filename)
{
using (var reader = XmlReader.Create(filename))
{
var serializer = new XmlSerializer(typeof(OrderModel));
var model = (OrderModel) serializer.Deserialize(reader);
return model;
}
}
}
[XmlRoot(ElementName = "order")]
public class OrderModel
{
[XmlElement(ElementName = "purchaser")]
public CompanyModel Purchaser { get; set; }
[XmlElement(ElementName = "deliverver")]
public CompanyModel Deliverver { get; set; }
[XmlElement(ElementName = "position")]
public List<OrderPositionModel> Positions { get; set; }
}
public class OrderPositionModel
{
[XmlAttribute("id")]
public int id { get; set; }
[XmlAttribute("lp")]
public int OrdinalNumber { get; set; }
[XmlAttribute("name")]
public string Name { get; set; }
[XmlAttribute("quantity")]
public int Quantity { get; set; }
}
public class CompanyModel
{
[XmlElement(ElementName = "name")]
public string Name { get; set; }
[XmlElement(ElementName = "address")]
public string Address { get; set; }
}
}
Upvotes: 2