如何获得具有相同id的多个记录,如果有多个c#中的xml元素

本文关键字:data 中的 元素 xml 如果 id 何获得 记录 | 更新日期: 2023-09-27 18:18:19

如果有多个数据元素,我想要多个记录,因此id和log元素将对每个数据记录保持相同。

注意:在XML中会有多个元素,下面的例子中,下面只针对单个

xml代码:

<pay>
  <id>1</id>
  <data>
    <startDate>2016-03-03</startDate>
    <adjustedDueDate>2016-03-31</adjustedDueDate>
    <Rate>50</Rate>
</data>
<data>
    <startDate>2016-04-04</startDate>
    <adjustedDueDate>2016-04-04</adjustedDueDate>
    <Rate>12</Rate>
</data>
<log>IMP</log>
</pay>

c#代码
string path = @"E:'XMLFile1.xml";
XDocument xmlExeDoc = XDocument.Load(path);
var recordsFac = xmlExeDoc.Descendants("pay").Select(x => new
{
    id = (string)x.Element("id"),
    cycle = x.Elements("data").Select(y => new
    {
        startDate = (y.Elements("startDate").Any() == true) ? (string)y.Element("startDate") : string.Empty,
        adjustedDueDate = (DateTime)y.Element("adjustedDueDate"),
        Rate = (decimal)y.Element("Rate")
    }).Where(y => y.Rate > 0 && y.adjustedDueDate < DateTime.Now)
                           .Select
                           (
                               c => new
                               {
                                   startDate = c.startDate,
                                   adjustedDueDate = c.adjustedDueDate,
                                   Rate = c.Rate
                               }
                           ).FirstOrDefault(),
    log = x.Element("log")
}).ToList();

要求输出:

输出:

[0]{1, 2016-03-03, 2016-03-31, 50岁的小鬼}

[1]{1, 2016-04-04, 2016-04-04, 12日IMP}

需要像这里一样的输出,但添加了另一个元素,我已经像下面给出的那样编码,这是正确的方法,需要2行和2行元素。

<pay>
  <id>1</id>
  <data>
    <startDate>2016-03-03</startDate>
    <adjustedDueDate>2016-03-31</adjustedDueDate>
    <Rate>50</Rate>
</data>
<data>
    <startDate>2016-04-04</startDate>
    <adjustedDueDate>2016-04-04</adjustedDueDate>
    <Rate>12</Rate>
</data>
<log>IMP</log>
</pay>
<ClientData>
    <startDate>2016-07-04</startDate>
    <adjustedDueDate>2016-08-04</adjustedDueDate>
    <Rate>100</Rate>
</ClientData>
<ClientData>
    <startDate>2016-09-04</startDate>
    <adjustedDueDate>2016-09-04</adjustedDueDate>
    <Rate>555</Rate>
</ClientData>
</pay>

var recordsFac = xmlExeDoc.Descendants("pay").Select(x => new
{
    cycle = x.Elements("data").Select(y => new
    {
        id = (string)x.Element("id"),
        startDate = (y.Elements("startDate").Any() == true) ? (string)y.Element("startDate") : string.Empty,
        adjustedDueDate = (DateTime)y.Element("adjustedDueDate"),
        Rate = (decimal)y.Element("Rate"),
        log = x.Element("log")
    }).Where(y => y.Rate > 0 && y.adjustedDueDate < DateTime.Now),
    ClientData = x.Elements("data").Select(y => new
    {
        id = (string)x.Element("id"),
        startDate = (y.Elements("startDate").Any() == true) ? (string)y.Element("startDate") : string.Empty,
        adjustedDueDate = (DateTime)y.Element("adjustedDueDate"),
        Rate = (decimal)y.Element("Rate"),
        log = x.Element("log")
    }).Where(y => y.Rate > 0 && y.adjustedDueDate < DateTime.Now)
}).ToList();

是上述代码实现这一点的正确方法:

输出:

[0]{1, 2016-03-03, 2016-03-31, 50岁的小鬼}

[1]{1, 2016-04-04, 2016-04-04, 12日IMP}

[2]{1, 2016-07-04, 2016 - 08 - 04100,小鬼}

[3]{1, 2016-09-04, 2016 - 09 - 04555,小鬼}

如何获得具有相同id的多个记录,如果有多个<data>c#中的xml元素

您的查询已经产生了您所要求的内容,但是您将循环查询限制为FirstOrDefault,因此它只会产生1条记录。如果你删除了它,那么循环将包含两个记录。

要获取id并登录与日期相同的记录,只需将它们包含在您正在创建的最后一个匿名类中:

var recordsFac = xmlExeDoc.Descendants("pay").Select(x => new
{
    cycle = x.Elements("data").Select(y => new
    {
        startDate = (y.Elements("startDate").Any() == true) ? (string)y.Element("startDate") : string.Empty,
        adjustedDueDate = (DateTime)y.Element("adjustedDueDate"),
        Rate = (decimal)y.Element("Rate"),
    }).Where(y => y.Rate > 0 && y.adjustedDueDate < DateTime.Now)
                           .Select
                           (
                               c => new
                               {
                                   id = (string)x.Element("id"),
                                   startDate = c.startDate,
                                   adjustedDueDate = c.adjustedDueDate,
                                   Rate = c.Rate,
                                   log = x.Element("log")
                               }
                           ),
}).ToList();

recordsFac将包含xml文件中每个pay元素的记录。每个记录的cycle属性将包含您所概述的数据。一个简单的嵌套foreach循环将访问数据:

foreach(var record in recordsFac)
{
    foreach(var record2 in record.cycle)
    {
        Console.WriteLine($"{record2.id},{record2.startDate},{record2.adjustedDueDate},{record2.log}");
    }
}

再看一下你的代码,发现最后的选择是多余的,可以删除:

var recordsFac = xmlExeDoc.Descendants("pay").Select(x => new
{
    cycle = x.Elements("data").Select(y => new
    {
        id = (string)x.Element("id"),
        startDate = (y.Elements("startDate").Any() == true) ? (string)y.Element("startDate") : string.Empty,
        adjustedDueDate = (DateTime)y.Element("adjustedDueDate"),
        Rate = (decimal)y.Element("Rate"),
        log = x.Element("log")
    }).Where(y => y.Rate > 0 && y.adjustedDueDate < DateTime.Now)               
}).ToList();
foreach(var record in recordsFac)
{
    foreach(var record2 in record.cycle)
    {
        Console.WriteLine($"{record2.id},{record2.startDate},{record2.adjustedDueDate},{record2.log}");
    }
}