I have a class called PurchaseOrderItem
public class PurchaseOrderItem
{
public Int64 PONumber { get; set; }
public string Description { get; set; }
public string UM { get; set; }
public int QTY { get; set; }
public double Cost { get; set; }
}
I’m trying to to read data from XML file by iterating sections from XML and populate data into PurchaseOrderItems which is List. But when i try the code below i’m getting an error message of “Object reference not set to an instance of an object.”
I’m pretty sure i’m missing something because my poor OOP knowledge. Would someone kindly explain to me what causes this problem?
PurchaseOrderItems =
(from purchaseOrderItem in PO.Descendants("PurchaseOrder").Elements("ProductLineItem")
select new PurchaseOrderItem
{
PONumber = PONumber,
Description = purchaseOrderItem.Element("PurchaseOrder").Element("ProductLineItem").Element("comments").Value.Trim(),
QTY = Convert.ToInt16(purchaseOrderItem.Element("PurchaseOrder").Element("ProductLineItem").Element("OrderQuantity").Element("requestedQuantity").Element("ProductQuantity").Value.Trim()),
UM = purchaseOrderItem.Element("PurchaseOrder").Element("ProductLineItem").Element("GlobalProductUnitOfMeasureCode").Value.Trim(),
Cost = Convert.ToDouble(purchaseOrderItem.Element("PurchaseOrder").Element("ProductLineItem").Element("requestedUnitPrice").Element("FinancialAmount").Element("MonetaryAmount").Value.Trim()),
}).ToList<PurchaseOrderItem>();
purchaseOrderItemis already aProductLineItemelement by the time you reach your select clause – so currently you’re trying to find aPurchaseOrderelement withinProductLineItem, which will return null if it isn’t found. I suspect you just want:Notes:
XElementtoshort,doubleetc is a more appropriate way of performing conversions for XML datadoublefor currency values: don’t do that – usedecimalinsteadAlso, you may want to consider creating a static method in
PurchaseOrderItemwhich knows how to deserialize one from anXElement; I often find that a pattern of:works well.