簡體   English   中英

使用LINQ將具有屬性的XML轉換為對象

[英]Convert XML with Attributes to Object with LINQ

我有一個XML文件設置,如下所示:

<products>
<product>
    <tradegood id = "11">Textiles</tradegood>
    <baseprice>3000</baseprice>
    <purchaseDMs>
        <mod type="A">-7</mod>
        <mod type="a">-5</mod>
        <mod type="i">-3</mod>
    </purchaseDMs>
    <resaleDMs>
        <mod type="A">-6</mod>
        <mod type="a">1</mod>
        <mod type="R">3</mod>
    </resaleDMs>
    <quantity>90</quantity>
</product>

我正在使用LINQ to XML,如下所示:

  XDocument productList = XDocument.Load("products.xml");

  List<Product> products = 
                (from objProduct in productList.Element("products").Elements("product")
                    select new Product
                    {
                         Id = int.Parse(objProduct.Element("tradegood").Attribute("id").Value),
                         ProductName = objProduct.Element("tradegood").Value,
                         BasePrice = double.Parse(objProduct.Element("baseprice").Value),
                         MaxQuantity = int.Parse(objProduct.Element("quantity").Value),
                         PurchaseDMs = (from _mods in objProduct.Element("purchaseDMs").Elements("mod")
                              select new 
                                {
                                key = _mods.Attribute("type").Value,
                                value = _mods.Value
                                }),
                         ResaleDMs = (from _mods in objProduct.Element("resaleDMs").Elements("mod")
                              select new 
                                {
                                key = _mods.Attribute("type").Value,
                                value = _mods.Value
                                })
                      }).ToList;

以下是產品類別:

public class Product
{
    private string p_ProductName;
    private double p_BasePrice;
    private int p_MaxQuantity;
    private double p_ActualValue;
    private int p_id;
    private int p_Quantity;

    public string ProductName
    {
        get { return p_ProductName; }
        set { p_ProductName = value; }
    }
    public double BasePrice
    {
        get { return p_BasePrice; }
        set { p_BasePrice = value; }
    }
    public int MaxQuantity
    {
        get { return p_MaxQuantity; }
        set { p_MaxQuantity = value; }
    }
    public int QuantityAvailable 
    {
        get { return p_Quantity; }
        set { p_Quantity = value; }
    }
    public double ActualValue
    {
        get { return p_ActualValue; }
        set { p_ActualValue = value; }
    }
    public int Id
    {
        get { return p_id; }
        set { p_id = value; }
    }

    public Dictionary<string, int> ResaleDMs;
    public Dictionary<string, int> PurchaseDMs;
}

我無法弄清楚如何開始工作的唯一部分是ResaleDM和PurchaseDM。

select語句均顯示“無法將類型'System.Collections.Generic.IEnumerable'隱式轉換為'System.Collections.Generic.Dictionary'。存在顯式轉換(您是否缺少類型轉換?”)

誰能幫我解決這個問題? 如何初始化這些字段?

之所以會出現該異常,是因為您正在為字典屬性分配IEnumerable投影的值。

當您這樣做時:

select new 
{
  key = _mods.Attribute("type").Value,
  value = _mods.Value
}

您只是在創建具有兩個屬性(鍵和值)的新匿名對象類型。 這並不直接與字典條目對象類型相關。 相反,您可以使用ToDictionary擴展方法。

PurchaseDMs = objProduct.Element("purchaseDMs").Elements("mod")
                        .ToDictionary(e => e.Attribute("type").Value, e => Convert.ToInt32(e.Value)),
ResaleDMs = objProduct.Element("resaleDMs").Elements("mod")
                      .ToDictionary(e => e.Attribute("type").Value, e => Convert.ToInt32(e.Value))

我認為您應該能夠通過使用ToArray()獲得IEnumerable:

List<Product> products = 
            (from objProduct in productList.Element("products").Elements("product")
                select new Product
                {
                     Id = int.Parse(objProduct.Element("tradegood").Attribute("ID").Value),
                     ProductName = objProduct.Element("tradegood").Value,
                     BasePrice = double.Parse(objProduct.Element("baseprice").Value),
                     MaxQuantity = int.Parse(objProduct.Element("quantity").Value),
                     PurchaseDMs = (from _mods in objProduct.Element("purchaseDMs").Elements("mod")
                          select new 
                            {
                            key = _mods.Attribute("type").Value,
                            value = _mods.Value
                            }),
                     ResaleDMs = (from _mods in objProduct.Element("resaleDMs").Elements("mod")
                          select new 
                            {
                            key = _mods.Attribute("type").Value,
                            value = _mods.Value
                            })
                  }).ToArray();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM