同时读取XML和实例化类

本文关键字:实例化 XML 读取 | 更新日期: 2023-09-27 18:21:23

我有一个名为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中的部分来读取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>();

同时读取XML和实例化类

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() { ... }
}

工作良好。