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-документов.

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

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