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

时间:2014-11-04 17:02:52

标签: 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")
    });

导致必须使用......

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

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

期望代码的想法

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", "");

1 个答案:

答案 0 :(得分:5)

听起来您需要的只是拨打First()Single()或其他任何内容 - 说您只需要一个结果(第一个或唯一结果 - 其他选项可用):

Ping ping = xmlDoc.Descendants("PING_SEND").Select(...).First();

基本上,问题是在Descendants(...).Select(...)之后你有Ping引用的序列,而你只需要一个。

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

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

OrDefault方法允许您处理没有结果的情况。