[C#]填充类对象的单个 XML LINQ 查询的方式吗?

标签: Linq XML C#
发布时间: 2017/2/27 4:06:35
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

在下面的 XML 片段,还有方式查询和填充一个 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 片段)︰

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"]
    });

我真的很喜欢的一件事是,这样将创建为 XML 数据中存在的多个事件允许 IEnumerable。

解决方法 1:

有没有办法查询和填充一个 LINQ 语句中的类对象吗?

是的好勇猛......,它仍然是相当丑陋。下文"单身"的多步 LINQ 语句可确保只属于相同的项目 map 选择元素。像您的代码示例,它将炸毁在你的脸如果具有所需的关键值的项丢失 (或"mrid"元素不是 int )。

var key_vals = new List<string> { "mrid", "mrtitle" };
var xdoc = XDocument.Load(@"c:\temp\test.xml");
var incidents = xdoc.Descendants("map").Select(map => {
    var items = map.Descendants("item").Where(i => key_vals.Contains(i.Attribute("key").Value));
    var idItem = items.Where(x => x.Attribute("key").Value == "mrid").First();
    var titleItem = items.Where(x => x.Attribute("key").Value == "mrtitle").First();
    return new Incident {
        ID = int.Parse(idItem.Value),
        Title = titleItem.Value
    };
});

foreach (var i in incidents)
    Console.WriteLine("ID = {0}, Title = {1}", i.ID, i.Title);

它将生成以下输出为您给定的 xml 输入文件︰

ID = 53030, Title = GeneralFeedback
赞助商