XNode.ReadFrom(XmlReader) Método

Definição

Cria um XNode a partir 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 neste XNode.

Devoluções

An XNode que contém o nó e os 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 num tipo de nó reconhecido.

O subjacente XmlReader lança uma exceção.

Exemplos

Este exemplo utiliza o seguinte ficheiro XML, denominadoSource.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 seguinte cria um método de eixo personalizado que utiliza ReadFrom e depois 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

Este exemplo produz a seguinte saída:

bbb
ccc

Observações

Pode usar este método para escrever um método que devolve uma coleção de nós, obtendo cada nó à medida que o nó é lido do leitor. Este método permite-lhe processar ficheiros XML arbitrariamente grandes com uma área de memória muito pequena.

O leitor que passar para este método pode lançar exceções. ReadFrom não apanha todas as exceções lançadas pelo leitor; As exceções não tratadas surgem até ao código que chamou ReadFrom. Em particular, o seu código deve estar preparado para lidar com XmlException.

Para um exemplo de como transmitir um documento mais complexo, veja Como transmitir fragmentos XML com acesso à informação do cabeçalho.

Certos operadores de consulta padrão, como OrderBy, iteram a sua fonte, recolhem todos os dados, ordenam-nos e, finalmente, produzem o primeiro item da sequência. Se usar um operador de consulta que materializa a sua fonte antes de obter o primeiro item, não manterá uma pequena área de memória.

Para um exemplo de utilização de LINQ para XML para transformar documentos XML extremamente grandes mantendo uma pequena área de memória, veja Como realizar a transformação em streaming de documentos XML grandes.

Aplica-se a

Ver também