如何使用linq-to-xml解析下面的xml字符串
本文关键字:xml 字符串 何使用 linq-to-xml | 更新日期: 2023-09-27 18:28:41
XML:
<shift_details>
<shift_time>10:00 to 10:30</shift_time>
<count>0</count>
<shift_time>10:30 to 11:00</shift_time>
<count>0</count>
<shift_time>11:00 to 11:30</shift_time>
<count>0</count>
<shift_time>11:30 to 12:00</shift_time>
<count>0</count>
<shift_time>12:00 to 12:30</shift_time>
<count>0</count>
</shift_details>
代码:
var slots = from c in xmlResponse.Descendants("shift_details")
select new TimeSlots
{
time = (string)c.Element("shift_time"),
count = (string)c.Element("count"),
};
上面的代码只返回一个slot项作为输出。但是我的xml包含太多记录。
如何读取上面xml中的所有记录?
Element
只返回具有给定名称的第一个元素您应该考虑更改XML结构,以将不同的插槽彼此分开,例如:
<shift_details>
<shift>
<shift_time>10:00 to 10:30</shift_time>
<count>0</count>
</shift>
(...)
</shift_details>
然后像这样查询:
var slots = from c in xmlResponse.Element("shift_details").Elements("shift")
select new TimeSlots
{
time = (string)c.Element("shift_time"),
count = (string)c.Element("count"),
};
或者,如果您不能更改XML,您仍然可以查询它,但这将有点棘手:
var doc = XDocument.Load("Input.txt");
var details = doc.Root;
var times = details.Elements("shift_time");
var counts = details.Elements("count");
var slots = times.Zip(counts, (t, c) => new { time = (string)t, count = (string)c }).ToList();
另一方面,如果不能更改XML的结构,则需要开始发挥创造性(尽管我不建议这样做)。在这种情况下,你可能会接受这样的东西(即使从长远来看不太容易维护),它接受一个元素集合,并将它们分割成块,每个块都包含唯一的元素:
public static class Extensions
{
public static IEnumerable<IEnumerable<XElement>> Partition(this IEnumerable<XElement> elements)
{
var currentList = new List<XElement>();
var tags = new HashSet<string>();
foreach (var xElement in elements)
{
if (tags.Contains(xElement.Name.LocalName))
{
yield return currentList.ToArray();
currentList.Clear();
tags.Clear();
}
currentList.Add(xElement);
tags.Add(xElement.Name.LocalName);
}
yield return currentList.ToArray();
}
}
然后,您可以通过此操作运行shift_details下的子集合,并获得相当易于处理的组。应该从这里一直往前走。