XNode.ReadFrom(XmlReader) Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
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
Zwraca
Element XNode zawierający węzeł i jego węzły podrzędne odczytane z czytnika. Typ środowiska uruchomieniowego węzła jest określany przez typ węzła (NodeType) pierwszego węzła napotkanego w czytniku.
Wyjątki
Element XmlReader nie jest umieszczony w rozpoznanym typie węzła.
XmlReader Podstawowy obiekt zgłasza wyjątek.
Przykłady
W tym przykładzie użyto następującego pliku XML o nazwie 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>
Poniższy przykład tworzy niestandardową metodę osi, która używa ReadFrom , a następnie wykonuje zapytania dotyczące osi niestandardowej przy użyciu zapytania 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
Ten przykład generuje następujące wyniki:
bbb
ccc
Uwagi
Za pomocą tej metody można napisać metodę, która zwraca kolekcję węzłów, dając każdemu węzłowi odczytane z czytnika. Ta metoda umożliwia przetwarzanie dowolnych dużych plików XML z bardzo małą ilością pamięci.
Czytelnik przekazany do tej metody może zgłaszać wyjątki. ReadFrom nie przechwytuje wszystkich wyjątków zgłaszanych przez czytelnika; nieobsługiwane wyjątki są wyświetlane w kodzie o nazwie ReadFrom. W szczególności kod powinien być przygotowany do obsługi XmlExceptionelementu .
Aby zapoznać się z przykładem przesyłania strumieniowego bardziej złożonego dokumentu, zobacz Jak przesyłać strumieniowo fragmenty XML z dostępem do informacji nagłówka.
Niektóre standardowe operatory zapytań, takie jak OrderBy, iterują swoje źródło, zbierają wszystkie dane, sortują je, a następnie w końcu dają pierwszy element w sekwencji. Jeśli używasz operatora zapytania, który materializuje jego źródło przed uzyskaniem pierwszego elementu, nie zachowasz małego śladu pamięci.
Aby zapoznać się z przykładem użycia LINQ to XML do przekształcania bardzo dużych dokumentów XML przy zachowaniu małej ilości pamięci, zobacz Jak wykonać transformację strumieniową dużych dokumentów XML.