XNode.ReadFrom(XmlReader) Methode
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
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
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.