XNode.ReadFrom(XmlReader) Método

Definição

Cria um XNode de um XmlReader.

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

reader
XmlReader

Um XmlReader posicionado no nó para ler nesse XNode.

Retornos

XNode

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.

Aplica-se a

Confira também