XNode.ReadFrom(XmlReader) 方法

定义

XmlReader 创建 XNode

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

定位于要读取到此 XNode 中的节点的 XmlReader

返回

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 文档执行流式转换

适用于

另请参阅