如何将具有相同名称的元素的值保存到List

时间:2013-12-28 19:21:25

标签: c# xml linq

我有这样的XML:

<SHOP>              
    <SHOPITEM>            
        <PRODUCTNAME>X</PRODUCTNAME>     
        <IMGURL_ALTERNATIVE>http://...img1.jpg</IMGURL_ALTERNATIVE>
        <IMGURL_ALTERNATIVE>http://...img2.jpg</IMGURL_ALTERNATIVE> 
    </SHOPITEM>                  
    <SHOPITEM>        
        <PRODUCTNAME>Y</PRODUCTNAME>         
        <IMGURL_ALTERNATIVE>http://...img3.jpg</IMGURL_ALTERNATIVE>
        <IMGURL_ALTERNATIVE>http://...img4.jpg</IMGURL_ALTERNATIVE>      
        <IMGURL_ALTERNATIVE>http://...img5.jpg</IMGURL_ALTERNATIVE> 
    </SHOPITEM>                                                                                                               
</SHOP>   

这样的课程:

public class Item
{
    public string Name { get; set; }
    public List<string> Images { get; set; }
}

我需要将该XML解析为Item的列表,并将每个PRODUCTNAME值保存到属性Name,并将IMGURL_ALTERNATIVE个元素的所有值保存到List属性Images

我试过这样的事但没有成功。

var items = from item in xmlDocument.Descendants("SHOPITEM")
              select new Item
              {
                  Name = item.Element("PRODUCTNAME").Value,
                  ImagesUrl =  
                      {
                         (from img in item.Descendants("IMGURL_ALTERNATIVE")
                          select item.Value.ToString()).ToList(),
                      }
              };

2 个答案:

答案 0 :(得分:4)

使用此代码:

XDocument xDoc = XDocument.Load(path);

List<Item>  itemList = (from e in xDoc.Descendants("SHOPITEM")
                        select new Item {  
                        Name = e.Element("PRODUCTNAME").Value,
                        Images = (from i in e.Elements("IMGURL_ALTERNATIVE")
                                    select i.Value).ToList()
                                    }).ToList();

答案 1 :(得分:1)

如何使用Linq to Xml

var items = XDocument.Load(fname)
     .Descendants("SHOPITEM")
     .Select(s => new Item
     {
         Name = (string)s.Element("PRODUCTNAME"),
         Images = s.Elements("IMGURL_ALTERNATIVE").Select(x => (string)x).ToList()
     });