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 ドキュメントのストリーミング変換を実行する方法」を参照してください。
適用対象
こちらもご覧ください
.NET