将XML转换为C#Dictionary

时间:2011-04-07 19:16:48

标签: xml linq dictionary

我的XML响应如下:

<?xml version="1.0" encoding="utf-8"?>
<response>
  <scheme>
    <name>name_1</name>
    <items>
      <item>
        <itemid>testid_1</itemid>
        <new></new>
        <used></used>
      </item>
      <item>
        <itemid>testid_2</itemid>
        <new></new>
        <used></used>
      </item>
    </items>
  </scheme>
  <scheme>
    <name>name_2</name>
    <items>
      <item>
        <itemid>testid_3</itemid>
        <new></new>
        <used></used>
      </item>
    </items>
  </scheme>
</response>

我必须将此XML响应转换为Dictionary<string, List<Item>>。字典中的每个条目都是<scheme>元素,其中Dictionary的键是<name>节点,而Dictionary的值是List<Item>,其中Item对象由itemid组成。 newusedvar items = from item in itemsXml.Descendants("scheme") select new Item { ItemId = item.Element("itemid").Value, New = item.Element("new").Value, Used = item.Element("used").Value, };

到目前为止,我的代码看起来像是:

<name>

所以我上面的代码会创建一个Item列表,但是如何访问每个<scheme>节点中的<name>节点?同样,List<Item>是关键,每个方案下的{{1}}都是我的词典的值。

有关不同方法的任何建议吗?!?我绝对不会这样做..

2 个答案:

答案 0 :(得分:4)

尝试这种方法:

var dict = xml.Elements("scheme")
              .ToDictionary(e => e.Element("name").Value,
                            e => e.Descendants("item")
                                  .Select(item => new Item()
                                  {
                                      ItemId = item.Element("itemid").Value,
                                      New = item.Element("new").Value,
                                      Used = item.Element("used").Value
                                  }).ToList()
                           );

答案 1 :(得分:2)

它必须是字典吗?

我问的原因是,您可以创建具有商品属性的商品类。 然后创建一个scheme类,它具有一个名为“Name”的属性以及一个List属性。

然后,您可以使用.NET反序列化来创建方案列表,每个方案都有一个项目列表。

类似的东西:

public class Response
{
    public IList<Scheme> Schemes {get; set;}
}

public class Scheme
{
    public string Name {get; set;}
    public IList<Item> Items {get; set;}
}

public class Item
{
    public string ItemId {get; set;}
    public bool New {get; set;}
    public bool Used {get; set;}
}

然后按照这样的教程:http://sharpertutorials.com/serialization/ 让.Net为你做反序列化。

当然,如果你不得不做一本字典,这将不起作用。