2012-01-26 43 views
0

实例化类我有一个名为PurchaseOrderItem读取XML,并在同一时间

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迭代部分来读取XML文件中的数据和数据填充到PurchaseOrderItems这是List类。但是,当我尝试下面的代码时,我得到一个错误消息“对象引用未设置为对象的实例。” 我很确定我错过了一些东西,因为我的可怜的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>(); 

回答

2

purchaseOrderItem已经被你达到你的SELECT子句的时间ProductLineItem元素 - 所以目前你试图内ProductLineItem找到PurchaseOrder元素,这将返回null如果找不到它。我怀疑你只是想:

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(); 

注:

XElementshortdouble
  • 使用显式转换为XML数据进行转换的一个更合适的方式
  • 它看起来像你'double货币值:不要那样做 - 使用decimal代替

另外,您可能需要考虑在PurchaseOrderItem中创建一个静态方法,该方法知道如何从XElement反序列化一个;我经常发现一种模式:

class Foo 
{ 
    static Foo FromXElement(XElement element) { ... } 
    XElement ToXElement() { ... } 
} 

很好。

+0

请问为什么我应该使用小数点而不是双倍货币值? –

+0

@ SiHyungLee:你喜欢丢失数据吗? ;)十进制是为精确表示十进制值的值设计的 - 通常是金融值。 Double使用* binary *表示,所以像“0.1”这样的东西不能完全表示。有关更多详细信息,请参见http://csharpindepth.com/Articles/General/FloatingPoint.aspx和http://csharpindepth.com/Articles/General/Decimal.aspx。 –

+0

我虽然双也可以处理小数点,并有比小数更大的容量。我的错。谢谢。 –