XNode.ReadFrom(XmlReader) Methode

Definition

Erstellt ein 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 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.

Gilt für:

Weitere Informationen