【发布时间】:2015-07-24 00:04:25
【问题描述】:
鉴于以下 XML sn-p,有没有办法在一个 LINQ 语句中查询和填充类对象?由于需要使用属性值进行选择,因此令人困惑。
<data>
<array>
<item key="0">
<map>
<item key="mrid">53030</item>
<item key="mrtitle">GeneralFeedback</item>
</map>
</item>
</array>
</data>
类:
public class Incident
{
public int ID { get; set; }
public string Title { get; set; }
}
当前(工作)代码(其中结果是作为字符串的 XML sn-p):
var data = XDocument.Parse(result);
var id = from item in data.Descendants("item")
where item.Attribute("key").Value == "mrid"
select item.Value;
var title = from item in data.Descendants("item")
where item.Attribute("key").Value == "mrtitle"
select item.Value;
var incident = new Incident
{
ID = Convert.ToInt32(id.FirstOrDefault()),
Title = title.FirstOrDefault()
};
根据给出的答案,我学到了一些有用的东西并想出了这个变体:
var incidents = data.Descendants("map")
.Select(i => i.Descendants("item")
.ToDictionary(m => m.Attribute("key").Value, m => m.Value))
.Where(i => i.ContainsKey("mrid")
&& i.ContainsKey("mrtitle"))
.Select(i => new Incident
{
ID = int.Parse(i["mrid"]),
Title = i["mrtitle"]
});
我真正喜欢的一件事是,它创建了一个 IEnumerable,它允许 XML 数据中存在多个事件。
【问题讨论】:
标签: c# xml linq linq-to-xml