如何获得具有相同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,小鬼}
您的查询已经产生了您所要求的内容,但是您将循环查询限制为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}");
}
}