Есть ли лучший способ читать потомки XML в LINQ-to-XML? - PullRequest
0 голосов
/ 20 января 2011

У меня есть такой код:

string result = xml.Root.Descendants("XYZ").Descendants("ABC").Descendants("MNO").Single().Value;

1) Есть ли лучший способ прочитать значение? Какой-то общий путь, который не зависит от количества глубоких узлов, которые я должен идти?

2) Каким будет подход для устранения жестко запрограммированной зависимости от "XYZ", "ABC" и т. Д.?

Ответы [ 2 ]

2 голосов
/ 20 января 2011

Непонятно, что вы на самом деле имеете в виду, но это то, что вы ищете?

public IEnumerable<XElement> PathDescendants(
    this XElement element,
    params XName[] names)
{
    return new[] { element }.PathDescendants(names);
}

public IEnumerable<XElement> PathDescendants(
    this IEnumerable<XElement> elements,
    params XName[] names)
{
    return names.Aggregate(elements,
                           (current, name) => current.Descendants(name));
}

Тогда вы можете позвонить:

string result = xml.Root.PathDescendants("XYZ", "ABC", "MNO").Single().Value;
2 голосов
/ 20 января 2011

Если вас не волнует зависимость от родительского узла, вы можете просто перейти к "MNO" в вызове потомков.

xml.Root.Descendants("MNO")

Однако это приведет к последовательности MNO потомков, где бы они ни отображались в вашей структуре XML.

<root>
   <MNO />
   <ABC>
      <MNO />
   </ABC>
   <ABC>
      <XYZ>
         <MNO />
      </XYZ>
   </ABC>
</root>

Все элементы MNO будут в последовательности.

...