Extensions.DescendantNodes(IEnumerable) Method
Definition
Important
Some information relates to prerelease product that may be substantially modified before it’s released. Microsoft makes no warranties, express or implied, with respect to the information provided here.
Returns a collection of the descendant nodes of every document and element in the source collection.
public:
generic
where T : System::Xml::Linq::XContainer[System::Runtime::CompilerServices::Extension]
static System::Collections::Generic::IEnumerable ^ DescendantNodes(System::Collections::Generic::IEnumerable ^ source);
public static System.Collections.Generic.IEnumerable DescendantNodes(this System.Collections.Generic.IEnumerable source) where T : System.Xml.Linq.XContainer;
public static System.Collections.Generic.IEnumerable DescendantNodes(this System.Collections.Generic.IEnumerable source) where T : System.Xml.Linq.XContainer;
static member DescendantNodes : seq<'T (requires 'T :> System.Xml.Linq.XContainer)> -> seq (requires 'T :> System.Xml.Linq.XContainer)
Public Function DescendantNodes(Of T As XContainer) (source As IEnumerable(Of T)) As IEnumerable(Of XNode)
Type Parameters
- T
The type of the objects in source, constrained to XContainer.
Parameters
- source
-
IEnumerable
An IEnumerable
Returns
An IEnumerable
Examples
The following example retrieves a collection of two elements, and then retrieves a collection of all descendant nodes for every element in the source collection. Note that the attribute of the GrandChild element is not surfaced as a node.
XElement xmlTree = XElement.Parse(
@"
aaaText
cccText ddd
");
IEnumerable nodes =
from node in xmlTree.Elements("Child").DescendantNodes()
select node;
foreach (XNode node in nodes)
{
switch (node.NodeType)
{
case XmlNodeType.Element:
Console.WriteLine("Element: {0}", ((XElement)node).Name);
break;
case XmlNodeType.Text:
Console.WriteLine("Text: {0}", ((XText)node).Value);
break;
case XmlNodeType.Comment:
Console.WriteLine("Comment: {0}", ((XComment)node).Value);
break;
case XmlNodeType.ProcessingInstruction:
Console.WriteLine("PI: {0}", ((XProcessingInstruction)node).Data);
break;
}
}
Dim xmlTree As XElement = _
aaaText
cccText ddd
Dim nodes As IEnumerable(Of XNode) = _
From node In xmlTree..DescendantNodes _
Select node
For Each node As XNode In nodes
Select Case node.NodeType
Case XmlNodeType.Element
Console.WriteLine("Element: {0}", DirectCast(node, XElement).Name)
Case XmlNodeType.Text
Console.WriteLine("Text: {0}", DirectCast(node, XText).Value)
Case XmlNodeType.Comment
Console.WriteLine("Comment: {0}", DirectCast(node, XComment).Value)
Case XmlNodeType.ProcessingInstruction
Console.WriteLine("PI: {0}", DirectCast(node, XProcessingInstruction).Data)
End Select
Next
This example produces the following output:
Text: aaa
Element: GrandChild
Text: Text
Comment: a comment
PI: type='text/xsl' href='test.xsl'
Text: ccc
Element: GrandChild
Text: Text
Text: ddd
The following is the same example, but in this case the XML is in a namespace. For more information, see Work with XML Namespaces.
XNamespace aw = "http://www.adventure-works.com";
XElement xmlTree = XElement.Parse(
@"
aaaText
cccText ddd
");
IEnumerable nodes =
from node in xmlTree.Elements(aw + "Child").DescendantNodes()
select node;
foreach (XNode node in nodes)
{
switch (node.NodeType)
{
case XmlNodeType.Element:
Console.WriteLine("Element: {0}", ((XElement)node).Name);
break;
case XmlNodeType.Text:
Console.WriteLine("Text: {0}", ((XText)node).Value);
break;
case XmlNodeType.Comment:
Console.WriteLine("Comment: {0}", ((XComment)node).Value);
break;
case XmlNodeType.ProcessingInstruction:
Console.WriteLine("PI: {0}", ((XProcessingInstruction)node).Data);
break;
}
}
Imports
Module Module1
Sub Main()
Dim xmlTree As XElement = _
aaaText
cccText ddd
Dim nodes As IEnumerable(Of XNode) = _
From node In xmlTree..DescendantNodes _
Select node
For Each node As XNode In nodes
Select Case node.NodeType
Case XmlNodeType.Element
Console.WriteLine("Element: {0}", DirectCast(node, XElement).Name)
Case XmlNodeType.Text
Console.WriteLine("Text: {0}", DirectCast(node, XText).Value)
Case XmlNodeType.Comment
Console.WriteLine("Comment: {0}", DirectCast(node, XComment).Value)
Case XmlNodeType.ProcessingInstruction
Console.WriteLine("PI: {0}", DirectCast(node, XProcessingInstruction).Data)
End Select
Next
End Sub
End Module
This example produces the following output:
Text: aaa
Element: {http://www.adventure-works.com}GrandChild
Text: Text
Comment: a comment
PI: type='text/xsl' href='test.xsl'
Text: ccc
Element: {http://www.adventure-works.com}GrandChild
Text: Text
Text: ddd
Remarks
This axis extension method is used on XDocument and XElement objects. Both of these types derive from XContainer, so this method operates on an IEnumerable
Although Visual Basic has an integrated XML axis for descendant elements, there is no integrated axis for descendant nodes, so Visual Basic users must use this axis method explicitly.
This method uses deferred execution.