我有一个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>
元素,其中字典的键是<name>
节点,字典的值是List<Item>
,其中Item
对象由itemid
, new
和used
组成。
var 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,
};
所以我上面的代码将为我创建一个Item列表,但是我如何访问每个<scheme>
节点中的<name>
节点?同样,<name>
是密钥,每个方案下的List<Item>
是我的Dictionary的值。
有什么建议吗?? ??我肯定做得不对…
试试这个方法:
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()
);
必须是字典吗?
我问的原因是,你可以创建一个item类,它有你的item属性。然后创建一个方案类,它有一个名为"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为你做反序列化。
当然,如果你必须做一个字典,这将不起作用。