проблема анализа глубоко вложенных атрибутов с использованием LINQ to XML - PullRequest
2 голосов
/ 12 сентября 2010

Я пытался разобрать этот xml в c #

<schema uri=http://blah.com/schema >
   <itemGroups>
     <itemGroup description="itemGroup1 label="itemGroup1">
       <items>
        <item description="The best" itemId="1" label="Nutella"/>
        <item description="The worst" itemId="2" label="Vegemite"/>
       </items>
     </itemGroup>
   </itemGroups>
</schema>

\itemGroup1\Nutella-The best
\itemGroup1\Vegemite-The worst

Любая помощь или направление будут оценены.

1 Ответ

6 голосов
/ 12 сентября 2010
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);
}
...