XNode.ReadFrom(XmlReader) メソッド

定義

XNode から 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

パラメーター

reader
XmlReader

この 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 ドキュメントのストリーミング変換を実行する方法」を参照してください。

適用対象

こちらもご覧ください