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