XNode.ReadFrom(XmlReader) Método
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
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
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.