Краткое резюме - вы хотите:
xml.Elements.Select(function(element) new XElement(element.Name,element.Attributes))
Первый ответ:
XElement.Descendants
, или это вопрос с подвохом? : P Вот пример использования Потомков здесь
Пересмотренный ответ, спасибо Тормод - что-то не так!:
Элементы дают прямых потомков, как вы ищете. Потомки дают полную иерархию [как вы утверждаете, элементы делает]. (Пример, с которым я связан, проясняет это. Извиняюсь за путаницу!
Итак, наконец, то, что вы ищете (на этот раз в VB):
Dim xml = <Root>
<Parent id="1">
<Child>Thomas</Child>
</Parent>
<Parent id="2">
<Child>Tim</Child>
<Child>Jamie</Child>
</Parent>
</Root>
REM All nodes two levels down in the hierarchy
Dim level2Nodes = xml.Elements.SelectMany(function(element) element.Elements)
level2Nodes.Dump
REM All Child nodes, no matter where they are:
Dim children = xml.Descendants("Child")
Каждый из которых даст вам 3 `` `элемента по разным причинам, описанным в REM.
(Вставьте вышеприведенное непосредственно в LINQPad в режиме оператора VB)
Теперь я вижу, что может вас смущать - когда вы используете Elements и просматриваете его в визуализаторе, вы все еще видите детей: -
Dim parents = xml.Elements
Если вам нужны только реальные имена, вы можете использовать что-то вроде:
Dim parentNames = xml.Elements.Select(function(element) element.Name)
Обратите внимание, что в каждом из этих случаев вы получаете два результата.
Если вы действительно хотите раздеть детей, вы хотите:
Dim parentElements = xml.Elements.Select(function(element) new XElement(element.Name,element.Attributes))
Можете ли вы расширить свой вопрос, чтобы показать, что вы действительно ищете?