XNode.ReadFrom(XmlReader) 方法  
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
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.XNodePublic Shared Function ReadFrom (reader As XmlReader) As XNode参数
返回
一个 XNode,其中包含从此读取器读取的节点及其子代节点。 节点的运行时类型由读取器中出现的第一个节点的节点类型 (NodeType) 确定。
例外
XmlReader 未定位于已识别的节点类型。
基础 XmlReader 引发异常。
示例
此示例使用以下名为 Source.xml 的 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>
以下示例创建一个自定义轴方法,该方法使用 LINQ 查询来查询 ReadFrom 自定义轴:
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 文档执行流式转换。