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
- reader
- XmlReader
Ein XmlReader an dem Knoten positionierter Knoten, der in dieses XNodeElement eingelesen werden soll.
Gibt zurück
Eine XNode , die den Knoten und die untergeordneten Knoten enthält, die vom Leser gelesen wurden. Der Laufzeittyp des Knotens wird durch den Knotentyp (NodeType) des ersten Knotens bestimmt, der im Reader gefunden wurde.
Ausnahmen
Die XmlReader Position wird nicht auf einem erkannten Knotentyp positioniert.
Der zugrunde liegende XmlReader Fehler löst eine Ausnahme aus.
Beispiele
In diesem Beispiel wird die folgende XML-Datei namens Source.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 mithilfe einer LINQ-Abfrage verwendet ReadFrom und dann 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 Sammlung von Knoten zurückgibt, wobei jeder Knoten zurückgegeben wird, während der Knoten vom Leser gelesen wird. Mit dieser Methode können Sie beliebig große XML-Dateien mit sehr geringem Speicherbedarf verarbeiten.
Der Leser, den Sie an diese Methode übergeben, löst möglicherweise Ausnahmen aus. ReadFrom fangen nicht alle Ausnahmen ab, die vom Leser ausgelöst werden; die unbehandelten Ausnahmen bis zum Code, der aufgerufen wurde ReadFrom. Insbesondere sollte Ihr Code für die Verarbeitung XmlExceptionvorbereitet sein.
Ein Beispiel zum Streamen eines komplexeren Dokuments finden Sie unter Streamen von XML-Fragmenten mit Zugriff auf Kopfzeileninformationen.
Bestimmte Standardabfrageoperatoren, z OrderBy. B. die Quelle durchlaufen, alle Daten sammeln, sortieren und schließlich das erste Element in der Sequenz liefern. Wenn Sie einen Abfrageoperator verwenden, der seine Quelle materialisiert, bevor sie das erste Element zurückgibt, behalten Sie keinen geringen Speicherbedarf.
Ein Beispiel für die Verwendung von LINQ to XML zum Transformieren extrem großer XML-Dokumente bei gleichzeitiger Beibehaltung eines geringen Speicherbedarfs finden Sie unter How to perform streaming transform of large XML documents.