XNode.ReadFrom(XmlReader) Methode

Definitie

Hiermee maakt u een XNode van een 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

Parameters

reader
XmlReader

Een XmlReader positie op het knooppunt om dit XNodein te lezen.

Retouren

Een XNode met het knooppunt en de onderliggende knooppunten die zijn gelezen uit de lezer. Het runtimetype van het knooppunt wordt bepaald door het knooppunttype (NodeType) van het eerste knooppunt dat in de lezer is aangetroffen.

Uitzonderingen

Het XmlReader is niet op een herkend knooppunttype weergegeven.

De onderliggende XmlReader waarde genereert een uitzondering.

Voorbeelden

In dit voorbeeld wordt het volgende XML-bestand met de naam Source.xmlgebruikt:

<?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>

In het volgende voorbeeld wordt een aangepaste asmethode gemaakt die de aangepaste as gebruikt ReadFrom en vervolgens een query uitvoert op de aangepaste as met behulp van een LINQ-query:

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

In dit voorbeeld wordt de volgende uitvoer gegenereerd:

bbb
ccc

Opmerkingen

U kunt deze methode gebruiken om een methode te schrijven die een verzameling knooppunten retourneert, wat elk knooppunt oplevert terwijl het knooppunt wordt gelezen door de lezer. Met deze methode kunt u willekeurige grote XML-bestanden verwerken met een zeer kleine geheugenvoetafdruk.

De lezer die u aan deze methode doorgeeft, kan uitzonderingen genereren. ReadFrom niet alle uitzonderingen onderscheppen die door de lezer worden gegenereerd; de niet-verwerkte uitzonderingen bellen tot aan de code die wordt aangeroepen ReadFrom. In het bijzonder moet uw code worden voorbereid om te worden verwerkt XmlException.

Zie XML-fragmenten streamen met toegang tot headergegevens voor een voorbeeld van het streamen van een complexer document.

Bepaalde standaardqueryoperators, zoals OrderByhet herhalen van hun bron, verzamelen alle gegevens, sorteren en vervolgens het eerste item in de reeks opleveren. Als u een queryoperator gebruikt die de bron materialiseert voordat u het eerste item oplevert, behoudt u geen kleine geheugenvoetafdruk.

Zie Hoe u streamingtransformatie van grote XML-documenten uitvoert voor een voorbeeld van het gebruik van LINQ naar XML om extreem grote XML-documenten te transformeren terwijl u een kleine geheugenvoetafdruk behoudt.

Van toepassing op

Zie ook