Прочитать на английском

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


XNode.ReadFrom(XmlReader) Метод

Определение

Создает объект XNode из объекта XmlReader.

public static System.Xml.Linq.XNode ReadFrom(System.Xml.XmlReader reader);

Параметры

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);
    }
}

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

bbb  
ccc  

Комментарии

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

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

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

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

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

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

Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0

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