XNode.ReadFrom(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
Параметры
Возвращаемое значение
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-документов.