XNode.ReadFrom(XmlReader) Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
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
Návraty
Obsahuje XNode uzel a jeho podřízené uzly, které byly přečteny od čtenáře. Typ modulu runtime uzlu je určen typem uzlu (NodeType) prvního uzlu, se kterým se čtenář setkal.
Výjimky
Hodnota XmlReader není umístěna na rozpoznaný typ uzlu.
Podkladový objekt XmlReader vyvolá výjimku.
Příklady
V tomto příkladu se 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ří metodu vlastní osy, která používá ReadFrom a pak dotazuje vlastní osu 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 poskytuje každý uzel, protože uzel je přečtený od čtenáře. Tato metoda umožňuje zpracovávat libovolně velké soubory XML s velmi malou pamětí.
Č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. Váš kód by měl být zejména připravený na zpracování XmlException.
Příklad streamování složitějšího dokumentu najdete v tématu Streamování fragmentů XML s přístupem k informacím o hlavičce.
Některé standardní operátory dotazů, například OrderBy, iterují zdroj, shromáždí všechna data, seřadí je a nakonec vydají první položku v pořadí. Pokud použijete operátor dotazu, který materializuje jeho zdroj před vydání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ěti najdete v tématu Jak provést transformaci streamování velkých dokumentů XML.