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