Поделиться через


XNode.ReadFrom(XmlReader) Метод

Определение

Создает объект XNode из объекта 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

Параметры

reader
XmlReader

Объект XmlReader размещается в узле для считывания в данный XNode.

Возвращаемое значение

XNode, содержащий узел и его потомков, которые были считаны из считывателя. Тип среды выполнения узла определяется типом узла (NodeType) первого узла в считывателе.

Исключения

XmlReader не позиционируется в распознанном типе узла.

Базовый XmlReader вызывает исключение.

Примеры

В этом примере используется следующий XML-файл с именем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>

В следующем примере создается метод пользовательской оси, который использует ReadFrom и запрашивает пользовательскую ось с помощью запроса 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

В этом примере выводятся следующие данные:

bbb  
ccc  

Комментарии

Этот метод можно использовать для записи метода, который возвращает коллекцию узлов, возвращая каждый узел по мере считывания узла из средства чтения. Этот метод позволяет обрабатывать произвольно большие XML-файлы с очень небольшим объемом памяти.

Средство чтения, передаваемого в этот метод, может вызывать исключения. ReadFrom не перехватывает все исключения, создаваемые средством чтения; необработанных исключений пузырьков до кода, который вызвал ReadFrom. В частности, код должен быть подготовлен для обработки XmlException.

Пример потоковой передачи более сложного документа см. в статье Потоковая передача ФРАГМЕНТов XML с доступом к сведениям заголовка.

Некоторые стандартные операторы запросов, например OrderBy, проходят через источник, собирают все данные, сортируют их и выдают первый элемент последовательности. Если вы используете оператор запроса, который материализует источник раньше, чем выбирает первый элемент, занимаемая память увеличится.

Пример использования LINQ to XML для преобразования очень больших XML-документов с сохранением небольшого объема памяти см. в статье Выполнение потокового преобразования больших XML-документов.

Применяется к

См. также раздел