XNode.ReadFrom(XmlReader) Metoda

Definice

Vytvoří z XNode objektu 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

Parametry

reader
XmlReader

Umístění XmlReader v uzlu pro čtení do tohoto XNodeobjektu .

Návraty

Uzel XNode , který obsahuje uzel a jeho potomky, které byly přečteny od čtenáře. Typ modulu runtime uzlu je určen typem uzlu (NodeType) prvního uzlu zjištěného ve čtečce.

Výjimky

Není XmlReader umístěn na rozpoznaný typ uzlu.

Podklad XmlReader vyvolá výjimku.

Příklady

Tento příklad používá následující soubor XML s názvem Source.xml:

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

Následující příklad vytvoří vlastní metodu osy, která používá ReadFrom vlastní osu, a pak se na vlastní osu dotazuje pomocí dotazu LINQ:

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

Tento příklad vytvoří následující výstup:

bbb
ccc

Poznámky

Tuto metodu můžete použít k zápisu metody, která vrací kolekci uzlů a vrací každý uzel při čtení uzlu ze čtečky. Tato metoda umožňuje zpracovávat libovolně velké soubory XML s velmi malými nároky na paměť.

Čtenář, který předáte této metodě, může vyvolat výjimky. ReadFrom nezachytí všechny výjimky vyvolané čtenářem; neošetřené výjimky bubliny až do kódu, který volal ReadFrom. Konkrétně by měl být váš kód připravený na zpracování XmlException.

Příklad streamování složitějšího dokumentu naleznete v tématu Jak streamovat fragmenty XML s přístupem k informacím hlavičky.

Některé standardní operátory dotazů, například OrderByiterace jejich zdroje, shromažďují všechna data, seřadí je a nakonec vyvolají první položku v sekvenci. Pokud použijete operátor dotazu, který materializuje jeho zdroj před vytvořením první položky, nezachovají se malé nároky na paměť.

Příklad použití LINQ to XML k transformaci extrémně velkých dokumentů XML při zachování malé paměťové stopy naleznete v tématu Jak provést streamované transformace velkých dokumentů XML.

Platí pro

Viz také