XNode.ReadFrom(XmlReader) Methode

Definition

Erstellt einen XNode aus einem XmlReader.

public:
 static System::Xml::Linq::XNode ^ ReadFrom(System::Xml::XmlReader ^ reader);
public static System.Xml.Linq.XNode ReadFrom (System.Xml.XmlReader reader);
static member ReadFrom : System.Xml.XmlReader -> System.Xml.Linq.XNode
Public Shared Function ReadFrom (reader As XmlReader) As XNode

Parameter

reader
XmlReader

Ein XmlReader an dem Knoten, der in diesen XNode gelesen werden soll.

Gibt zurück

Ein XNode, der den Knoten und dessen Nachfolgerknoten enthält, die vom Reader gelesen wurden. Der Laufzeittyp des Knotens wird vom Knotentyp (NodeType) des ersten im Reader gefundenen Knotens bestimmt.

Ausnahmen

Der XmlReader ist an keinem bekannten Knotentyp positioniert.

Der zugrunde liegende XmlReader löst eine Ausnahme aus.

Beispiele

In diesem Beispiel wird die folgende XML-Datei mit dem NamenSource.xmlverwendet:

<?xml version="1.0" encoding="utf-8" ?>
<Root>
  <Child Key="01">
    <GrandChild>aaa</GrandChild>
  </Child>
  <Child Key="02">
    <GrandChild>bbb</GrandChild>
  </Child>
  <Child Key="03">
    <GrandChild>ccc</GrandChild>
  </Child>
</Root>

Im folgenden Beispiel wird eine benutzerdefinierte Achsenmethode erstellt, die die benutzerdefinierte Achse verwendet ReadFrom und dann mithilfe einer LINQ-Abfrage abfragt:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml;
using System.Xml.Linq;

class Program
{
    static IEnumerable<XElement> StreamRootChildDoc(string uri)
    {
        using (XmlReader reader = XmlReader.Create(uri))
        {
            reader.MoveToContent();
            
            // Parse the file and return each of the nodes.
            while (!reader.EOF)
            {
                if (reader.NodeType == XmlNodeType.Element && reader.Name == "Child")
                {
                    XElement el = XElement.ReadFrom(reader) as XElement;
                    if (el != null)
                        yield return el;
                }
                else
                {
                    reader.Read();
                }
            }
        }
    }

    static void Main(string[] args)
    {
        IEnumerable<string> grandChildData =
            from el in StreamRootChildDoc("Source.xml")
            where (int)el.Attribute("Key") > 1
            select (string)el.Element("GrandChild");

        foreach (string str in grandChildData)
            Console.WriteLine(str);
    }
}
Imports System.Collections.Generic
Imports System.Linq
Imports System.Xml
Imports System.Xml.Linq

Module Program
    Iterator Function StreamRootChildDoc(ByVal uri As String) As IEnumerable(Of XElement)

        Using reader As XmlReader = XmlReader.Create(uri)
            reader.MoveToContent()

            ' Parse the file and return each of the nodes.
            While Not reader.EOF

                If reader.NodeType = XmlNodeType.Element AndAlso reader.Name = "Child" Then
                    Dim el As XElement = TryCast(XElement.ReadFrom(reader), XElement)
                    If el IsNot Nothing Then Yield el
                Else
                    reader.Read()
                End If
            End While
        End Using
    End Function

    Sub Main(args As String())

        Dim grandChildData As IEnumerable(Of String) =
            From el In StreamRootChildDoc("Source.xml")
            Where CInt(el.Attribute("Key")) > 1
            Select CStr(el.Element("GrandChild"))

        For Each str As String In grandChildData
            Console.WriteLine(str)
        Next

    End Sub

End Module

Dieses Beispiel erzeugt die folgende Ausgabe:

bbb  
ccc  

Hinweise

Sie können diese Methode verwenden, um eine Methode zu schreiben, die eine Auflistung von Knoten zurückgibt und jeden Knoten ergibt, wenn der Knoten vom Leser gelesen wird. Mit dieser Methode können Sie beliebig große XML-Dateien mit einem sehr geringen Arbeitsspeicherbedarf verarbeiten.

Der Leser, den Sie an diese Methode übergeben, löst möglicherweise Ausnahmen aus. ReadFrom fängt nicht alle vom Leser ausgelösten Ausnahmen ab; die nicht behandelten Ausnahmen blasen bis zum Code, der aufgerufen hat ReadFrom. Insbesondere sollte Ihr Code für die Behandlung von XmlExceptionvorbereitet sein.

Ein Beispiel für das Streamen eines komplexeren Dokuments finden Sie unter Streamen von XML-Fragmenten mit Zugriff auf Headerinformationen.

Einige Standardabfrageoperatoren, wie OrderBy, durchlaufen ihre Quelle, erfassen alle Daten, sortieren sie und geben dann das erste Element in der Sequenz zurück. Bei Verwendung eines Abfrageoperators, der seine Quelle vor der Rückgabe des ersten Elements materialisiert, erhalten Sie keinen kleinen Arbeitsspeicher-Fußabdruck.

Ein Beispiel für die Verwendung von LINQ to XML zum Transformieren extrem großer XML-Dokumente unter Beibehaltung eines geringen Speicherbedarfs finden Sie unter Ausführen einer Streamingtransformation großer XML-Dokumente.

Gilt für:

Weitere Informationen