XNode.ReadFrom(XmlReader) Método
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
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
Parâmetros
Retornos
Um XNode que contém o nó e seus nós descendentes que foram lidos do leitor. O tipo de runtime do nó é determinado pelo tipo de nó (NodeType) do primeiro nó encontrado no leitor.
Exceções
O XmlReader não está posicionado em um tipo de nó reconhecido.
O XmlReader subjacente gera uma exceção.
Exemplos
Este exemplo usa o seguinte arquivo XML, chamado 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>
O exemplo a seguir cria um método de eixo personalizado que usa ReadFrom e consulta o eixo personalizado usando uma consulta 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
Esse exemplo gera a saída a seguir:
bbb
ccc
Comentários
Você pode usar esse método para escrever um método que retorna uma coleção de nós, gerando cada nó à medida que o nó é lido do leitor. Esse método permite processar arquivos XML arbitrariamente grandes com um volume de memória muito pequeno.
O leitor que você passa para esse método pode gerar exceções. ReadFrom não captura todas as exceções geradas pelo leitor; as exceções sem tratamento se acumulam até o código chamado ReadFrom. Em particular, seu código deve estar preparado para manipular XmlException.
Para obter um exemplo de como transmitir um documento mais complexo, consulte Como transmitir fragmentos XML com acesso a informações de cabeçalho.
Determinados operadores de consulta padrão, como OrderBy, iteram sua origem, coletam todos os dados, classificam e, em seguida, geram finalmente o primeiro item na sequência. Se você usar um operador de consulta que materialize sua origem antes de produzir o primeiro item, não manterá um pequeno volume de memória.
Para obter um exemplo de como usar LINQ to XML para transformar documentos XML extremamente grandes, mantendo um pequeno volume de memória, consulte Como executar a transformação de streaming de documentos XML grandes.