Извлечение XElement детей и внуков по имени - PullRequest
0 голосов
/ 01 августа 2011

У меня есть XElement (myParent), содержащий несколько уровней детей, из которых я хочу извлечь данные. Интересующие элементы находятся в известных местах родительского элемента.

Я понимаю, что могу получить дочерний элемент по:

myParent.Element(childName);

или

myParent.Element(level1).Element(childName);

У меня возникают проблемы с выяснением, как это сделать, если я хочу пройтись по массиву списка элементов, находящихся на разных уровнях, и пройтись по списку. Например, я заинтересован в получении следующего набора элементов:

myParent.Element("FieldOutputs").Element("Capacity");
myParent.Element("EngOutputs").Element("Performance")
myParent.Element("EngOutputs").Element("Unit").Element("Efficiency")

Как я могу определить эти местоположения в массиве, чтобы я мог просто проходить через массив?

т.е.

string[] myStringArray = {"FieldOutputs.Capacity", "EngOutputs.Performance", "EngOutputs.Unit.Efficiency"};

for (int i=0; i< myArray.Count(); i++)
{
    XElement myElement = myParent.Element(myStringArray);
}

Я понимаю, что описанный выше метод не работает, но просто хотел эффективно показать, чего я пытаюсь достичь.

Любые отзывы приветствуются.

Спасибо, Justin

Ответы [ 2 ]

6 голосов
/ 01 августа 2011

Хотя обычно я неохотно предлагаю использовать XPath, это, пожалуй, наиболее подходящий подход, использующий XPathSelectElement:

string[] paths = { "FieldOutputs/Capacity", "EngOutputs/Performance", 
                   "EngOutputs/Unit/Efficiency"};

foreach (string path in paths)
{
    XElement element = parent.XPathSelectElement(path);
    if (element != null)
    {
        // ...
    }
}
0 голосов
/ 01 августа 2011

Я считаю, что метод Descendants() - это то, что вы ищете. Например:

var descendants = myParent.Descendants();
foreach (var e in descendants) {
  ...
}

http://msdn.microsoft.com/en-us/library/system.xml.linq.xelement.descendants.aspx

Edit:

Если присмотреться к вашему вопросу более подробно, похоже, что вы захотите использовать XPathSelectElements ()

var descendants = myParent.XPathSelectElements("./FieldOutputs/Capacity | ./EngOutputs/Performance | ./EngOutputs/Units/Efficency");

http://msdn.microsoft.com/en-us/library/bb351355.aspx

...