我有一个名为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; }
}
我试图通过从XML迭代部分并将数据填充到ListO的PurchaseOrderItems中来读取XML文件中的数据。但是,当我尝试下面的代码时,我收到一条错误消息“对象引用未设置为对象的实例”。 我很确定我错过了一些东西,因为我的OOP知识很差。有人会向我解释是什么导致了这个问题吗?
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>();
答案 0 :(得分:2)
purchaseOrderItem
已经是ProductLineItem
个元素 - 所以目前您正在尝试在 {中找到PurchaseOrder
元素 {1}},如果找不到则返回null。我怀疑你只是想要:
ProductLineItem
注意:
PurchaseOrderItems =
(from purchaseOrderItem in PO.Descendants("PurchaseOrder").Elements("ProductLineItem")
select new PurchaseOrderItem
{
PONumber = PONumber,
Description = purchaseOrderItem.Element("comments").Value.Trim(),
QTY = (short) purchaseOrderItem.Element("OrderQuantity")
.Element("requestedQuantity")
.Element("ProductQuantity"),
UM = purchaseOrderItem.Element("GlobalProductUnitOfMeasureCode")
.Value.Trim(),
Cost = (double) purchaseOrderItem.Element("requestedUnitPrice")
.Element("FinancialAmount")
.Element("MonetaryAmount")
}).ToList();
到XElement
的显式转换,short
等是执行XML数据转换的更合适方式double
货币值:不这样做 - 请改为使用double
此外,您可能需要考虑在decimal
中创建一个静态方法,该方法知道如何从PurchaseOrderItem
反序列化一个方法;我经常发现一种模式:
XElement
效果很好。