petko_stankoski
petko_stankoski

Reputation: 10713

Deserializing xml returns zero elements

This is my xml:

<?xml version="1.0"?>
<orders>
  <order>
    <customer_id>5675757</customer_id>
    <order_code>6456</order_code>
    <products>
      <product>
        <product_item_code>577868</product_item_code>
        <product_item_amount>22</product_item_amount>
      </product>
    </products>
  </order>
</orders>

And this is my class:

[XmlRoot(ElementName = "orders")]
public class Orders
{
    public List<OrderModel> OrdersList { get; set; }
}

[XmlRoot(ElementName = "order")]
public class OrderModel
{
    [XmlElement(ElementName = "customer_id")]
    public string CustomerId { get; set; }

    [XmlElement(ElementName = "order_code")]
    public string OrderCode { get; set; }

    [XmlElement(ElementName = "products")]
    public List<Product> products { get; set; }
}

[XmlRoot(ElementName = "product")]
public class Product
{
    [XmlElement(ElementName = "product_item_code")]
    public string product_item_code { get; set; }

    [XmlElement(ElementName = "product_item_amount")]
    public string product_item_amount { get; set; }
}

And this is my code:

using (FileStream fileStream = new FileStream(filePath, FileMode.Open))
{
    var serializer = new XmlSerializer(typeof(Orders));
    var orders = (Orders)serializer.Deserialize(fileStream);
}

But it returns 0 elements. I know I am missing something obvious but I don't know what.

Upvotes: 1

Views: 66

Answers (2)

Akshey Bhat
Akshey Bhat

Reputation: 8545

Modify your classes as below and it will work.

[XmlRoot(ElementName = "orders")]
public class Orders
{
    [XmlElement(ElementName = "order")]
    public List<OrderModel> OrdersList { get; set; }
}

public class OrderModel
{
    [XmlElement(ElementName = "customer_id")]
    public string CustomerId { get; set; }

    [XmlElement(ElementName = "order_code")]
    public string OrderCode { get; set; }

    [XmlArray(ElementName = "products")]
    [XmlArrayItem(ElementName = "product")]
    public List<Product> products { get; set; }
}

public class Product
{
    [XmlElement(ElementName = "product_item_code")]
    public string product_item_code { get; set; }

    [XmlElement(ElementName = "product_item_amount")]
    public string product_item_amount { get; set; }
}

Upvotes: 0

PinBack
PinBack

Reputation: 2564

Change you class Orders and OrderModel:

[XmlRoot(ElementName = "orders")]
public class Orders
{
    [XmlElement(ElementName = "order")]
    public List<OrderModel> OrdersList { get; set; }
}

[XmlRoot(ElementName = "order")]
public class OrderModel
{
    [XmlElement(ElementName = "customer_id")]
    public string CustomerId { get; set; }

    [XmlElement(ElementName = "order_code")]
    public string OrderCode { get; set; }

    [XmlArray(ElementName = "products")]
    [XmlArrayItem(ElementName = "product")]
    public List<Product> products { get; set; }
}

Then it should work

Upvotes: 2

Related Questions