使用lambda linq将xml转换为自定义类

Vol*_*rix 3 c# xml linq lambda

试图将xml文档解析为我创建的自定义类.我已经成功地弄清楚了如何解析文档,但由于某种原因,我不得不把它做成一个IEnumerable而不仅仅是我的自定义类的单个实例.更容易展示代码而不是深入解释,所以请参阅下面的代码片段.

工作守则

IEnumerable<Ping> ping = xmlDoc.Descendants("PING_SEND").Select(p => new Ping
    {
        TRAN_ID = (string)p.Element("TRAN_ID"),
        MILOC = (string)p.Element("MILOC"),
        TRANDATE = (string)p.Element("TRANDATE"),
        TRANTIME = (string)p.Element("TRANTIME"),
        COUNTRY = (string)p.Element("COUNTRY")
    });
Run Code Online (Sandbox Code Playgroud)

哪个结果必须使用......

foreach (Ping p in ping)
{
    cmd.Parameters.AddWithValue("@TRAN_ID", p.TRAN_ID);
    cmd.Parameters.AddWithValue("@MILOC", p.MILOC);
    cmd.Parameters.AddWithValue("@SITE_REF", "");
}
Run Code Online (Sandbox Code Playgroud)

...添加参数以插入数据库时​​.我试过(和需要)的东西更多的是这个......

期望的代码理念

Ping ping =(Ping)xmlDoc.Descendants("PING_SEND").Select(p => new Ping
    {
        TRAN_ID = (string)p.Element("TRAN_ID"),
        MILOC = (string)p.Element("MILOC"),
        TRANDATE = (string)p.Element("TRANDATE"),
        TRANTIME = (string)p.Element("TRANTIME"),
        COUNTRY = (string)p.Element("COUNTRY")
    });

//... Other operations and database functions...

cmd.Parameters.AddWithValue("@TRAN_ID", ping.TRAN_ID);
cmd.Parameters.AddWithValue("@MILOC", ping.MILOC);
cmd.Parameters.AddWithValue("@SITE_REF", "");
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

这听起来像所有你需要的是一个电话First()或Single()或什么-说你只想要一个结果(第一或唯一的结果-有其它选择):

Ping ping = xmlDoc.Descendants("PING_SEND").Select(...).First();
Run Code Online (Sandbox Code Playgroud)

基本上,问题是,经过Descendants(...).Select(...)你已经有了一个序列的Ping参考,而你只想要一个.

如果实际上可能存在多个PING_SEND元素 - 或者没有 - 您真的需要考虑在这种情况下您想要做什么.LINQ提供各种方法来帮助,具体取决于您的要求:

  • First
  • Single
  • Last
  • FirstOrDefault
  • SingleOrDefault
  • LastOrDefault

这些OrDefault方法允许您处理没有结果的情况.