同时读取XML和实例化类

时间:2012-01-26 08:24:10

标签: c# xml

我有一个名为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>();

1 个答案:

答案 0 :(得分:2)

当您到达select子句时,

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

效果很好。