XNode.ReadFrom(XmlReader) Metodo
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
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
Parametri
Restituisce
XNode che contiene il nodo e i nodi discendenti relativi letti dal lettore. Il tipo di runtime del nodo è determinato dal tipo di nodo (NodeType) del primo nodo incontrato nel lettore.
Eccezioni
XmlReader non è posizionato su un tipo di nodo riconosciuto.
Il XmlReader sottostante genera un'eccezione.
Esempio
In questo esempio viene utilizzato il file XML seguente, denominato 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>
Nell'esempio seguente viene creato un metodo dell'asse personalizzato che usa ReadFrom e quindi esegue una query sull'asse personalizzato usando una query 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
Nell'esempio viene prodotto l'output seguente:
bbb
ccc
Commenti
È possibile usare questo metodo per scrivere un metodo che restituisce una raccolta di nodi, che restituisce ogni nodo man mano che il nodo viene letto dal lettore. Questo metodo consente di elaborare file XML arbitrariamente di grandi dimensioni con un footprint di memoria molto ridotto.
Il lettore passato a questo metodo potrebbe generare eccezioni. ReadFrom non intercetta tutte le eccezioni generate dal lettore; le eccezioni non gestite vengono visualizzate nel codice che ha chiamato ReadFrom. In particolare, il codice deve essere preparato per gestire XmlException.
Per un esempio di come trasmettere un documento più complesso, vedere Come trasmettere frammenti XML con accesso alle informazioni sull'intestazione.
Determinati operatori di query standard, ad esempio OrderBy, scorrono l'origine, raccolgono tutti i dati, li ordinano e infine restituiscono il primo elemento nella sequenza. Se si usa un operatore di query che materializza l'origine prima di restituire il primo elemento, non si manterrà un footprint di memoria ridotto.
Per un esempio dell'uso di LINQ to XML per trasformare documenti XML di dimensioni estremamente grandi mantenendo un footprint di memoria ridotto, vedere Come eseguire la trasformazione in streaming di documenti XML di grandi dimensioni.