XDocument xDoc = XDocument.Load(myXml); //load your XML from file or stream
var rows = xDoc.Descendants("item").Select(x => string.Format(
@"\{0}-{1}\{2}-{3}",
x.Ancestors("itemGroup").First().Attribute("description").Value,
x.Ancestors("itemGroup").First().Attribute("label").Value,
x.Attribute("label").Value,
x.Attribute("description").Value));
Давайте разберемся, что мы делаем:
xDoc.Descendants("item")
получает нас всех <item>
элементов во всем документе
Select(x => string.Format(format, args)
проекты каждый <item>
мы получили из последней операции в любой формат, указанный в лямбда-выражении. В этом случае форматированная строка .
С точки зрения дерева XML, мы «сидим» на уровне <item>
, поэтому нам нужно свернуть дерево вверх, чтобы получить данные для родительской группы, используя Ancestors
. Поскольку этот метод возвращает последовательность элементов, мы знаем, что нам нужен первый (ближайший к нам), чтобы мы могли прочитать его атрибут.
Теперь у вас есть IEnumerable<string>
, по одному для каждого <item>
в вашем XML-документе и информация в указанном вами формате:
foreach(string row in rows)
{
Console.WriteLine(row);
}