Język

Extensions.DescendantNodes<T>(IEnumerable<T>) Metoda

Definicja

Zwraca kolekcję węzłów podrzędnych każdego dokumentu i elementu w kolekcji źródłowej.

public:
generic <typename T>
 where T : System::Xml::Linq::XContainer[System::Runtime::CompilerServices::Extension]
 static System::Collections::Generic::IEnumerable<System::Xml::Linq::XNode ^> ^ DescendantNodes(System::Collections::Generic::IEnumerable<T> ^ source);
public static System.Collections.Generic.IEnumerable<System.Xml.Linq.XNode> DescendantNodes<T>(this System.Collections.Generic.IEnumerable<T> source) where T : System.Xml.Linq.XContainer;
public static System.Collections.Generic.IEnumerable<System.Xml.Linq.XNode> DescendantNodes<T>(this System.Collections.Generic.IEnumerable<T?> source) where T : System.Xml.Linq.XContainer;
static member DescendantNodes : seq<'T (requires 'T :> System.Xml.Linq.XContainer)> -> seq<System.Xml.Linq.XNode> (requires 'T :> System.Xml.Linq.XContainer)
<Extension()>
Public Function DescendantNodes(Of T As XContainer) (source As IEnumerable(Of T)) As IEnumerable(Of XNode)

Parametry typu

T

Typ obiektów w obiekcie sourceograniczony do XContainer.

Parametry

source
IEnumerable<T>

IEnumerable<T> Element XContainer zawierający kolekcję źródłową.

Zwraca

Element IEnumerable<T> węzłów XNode podrzędnych każdego dokumentu i elementu w kolekcji źródłowej.

Przykłady

Poniższy przykład pobiera kolekcję dwóch elementów, a następnie pobiera kolekcję wszystkich węzłów podrzędnych dla każdego elementu w kolekcji źródłowej. Należy pamiętać, że atrybut GrandChild elementu nie jest wyświetlany jako węzeł.

XElement xmlTree = XElement.Parse(
@"<Root>
    <Child>aaa<GrandChild anAttribute='xyz'>Text</GrandChild>
        <!--a comment-->
        <?xml-stylesheet type='text/xsl' href='test.xsl'?>
    </Child>
    <Child>ccc<GrandChild>Text</GrandChild>ddd</Child>
</Root>");
IEnumerable<XNode> 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 = _
<Root>
    <Child>aaa<GrandChild anAttribute='xyz'>Text</GrandChild>
        <!--a comment-->
        <?xml-stylesheet type='text/xsl' href='test.xsl'?>
    </Child>
    <Child>ccc<GrandChild>Text</GrandChild>ddd</Child>
</Root>

Dim nodes As IEnumerable(Of XNode) = _
    From node In xmlTree.<Child>.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

Ten przykład generuje następujące wyniki:

Text: aaa
Element: GrandChild
Text: Text
Comment: a comment
PI: type='text/xsl' href='test.xsl'
Text: ccc
Element: GrandChild
Text: Text
Text: ddd

Poniżej przedstawiono ten sam przykład, ale w tym przypadku plik XML znajduje się w przestrzeni nazw. Aby uzyskać więcej informacji, zobacz Praca z przestrzeniami nazw XML.

XNamespace aw = "http://www.adventure-works.com";
XElement xmlTree = XElement.Parse(
@"<Root xmlns='http://www.adventure-works.com'>
    <Child>aaa<GrandChild anAttribute='xyz'>Text</GrandChild>
        <!--a comment-->
        <?xml-stylesheet type='text/xsl' href='test.xsl'?>
    </Child>
    <Child>ccc<GrandChild>Text</GrandChild>ddd</Child>
</Root>");
IEnumerable<XNode> 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 <xmlns="http://www.adventure-works.com">

Module Module1
    Sub Main()
        Dim xmlTree As XElement = _
        <Root>
            <Child>aaa<GrandChild anAttribute='xyz'>Text</GrandChild>
                <!--a comment-->
                <?xml-stylesheet type='text/xsl' href='test.xsl'?>
            </Child>
            <Child>ccc<GrandChild>Text</GrandChild>ddd</Child>
        </Root>

        Dim nodes As IEnumerable(Of XNode) = _
            From node In xmlTree.<Child>.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

Ten przykład generuje następujące wyniki:

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

Uwagi

Ta metoda rozszerzenia osi jest używana w obiektach XDocument i .XElement Oba te typy pochodzą z XContainerklasy , więc ta metoda działa na obiekcie IEnumerable<T>XContainer zawierającym kolekcję źródłową.

Mimo że Visual Basic ma zintegrowaną oś XML dla elementów podrzędnych, nie ma zintegrowanej osi dla węzłów podrzędnych, dlatego Visual Basic użytkownicy muszą jawnie użyć tej metody osi.

Ta metoda używa wykonania odroczonego.

Dotyczy

Zobacz też