同时读取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>();
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();
注:
- 使用从
XElement
到short
、double
等的显式转换是对XML数据执行转换的一种更合适的方式 - 看起来您正在使用
double
来表示货币值:不要这样做而是使用decimal
此外,您可能需要考虑在PurchaseOrderItem
中创建一个静态方法,该方法知道如何从XElement
反序列化一个方法;我经常发现一种模式:
class Foo
{
static Foo FromXElement(XElement element) { ... }
XElement ToXElement() { ... }
}
工作良好。