2012-01-26 11 views
0

私はXMLからのセクションを繰り返すことによって、XMLファイルからデータを読み込み、一覧でPurchaseOrderItemsにデータを取り込むためにしようとしている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; } 
} 

というクラスを持っています。しかし、以下のコードを試してみると、 "オブジェクト参照がオブジェクトのインスタンスに設定されていません"というエラーメッセージが表示されます。 私は貧しい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要素である - ので、現在、あなたはそれが見つからない場合はnullを返しますこれは、ProductLineItemPurchaseOrder要素を見つけるためにしようとしています。私はあなただけしたい疑う:

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

注:shortからXElementから明示的な変換を使用して

  • を、doubleなどは、XMLデータ
  • のための変換を実行するのがより適切な方法であるそれはあなたのように見えます通貨の値にdoubleを使用しています:do not do - 代わりにdecimalを使用してください。

XElementから逆シリアル化する方法を知っているPurchaseOrderItemに静的メソッドを作成することもできます。私はしばしば、次のようなパターンを見つけます:

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

がうまくいきます。

+0

なぜ私は二重ではなく通貨の値に小数点を使うべきか尋ねることができますか? –

+0

@SiHyungLee:データを失うのが好きですか? ;)小数は、小数点以下を正確に表すことができるように設計されています。 Doubleは*バイナリ*表現を代わりに使用するので、 "0.1"のようなものは正確に表現できません。詳細はhttp://csharpindepth.com/Articles/General/FloatingPoint.aspxおよびhttp://csharpindepth.com/Articles/General/Decimal.aspxを参照してください。 –

+0

私は二重も小数点を扱うことができ、小数点よりも大きな容量を持っていました。私の間違い。ありがとうございました。 –

関連する問題