XNode.ReadFrom(XmlReader) Methode
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
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
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.