Share via


XNode.ReadFrom(XmlReader) Metode

Definisi

XNode Membuat dari 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

Parameter

reader
XmlReader

Diposisikan XmlReader pada simpul untuk dibaca ke dalam ini XNode.

Mengembalikan

Yang XNode berisi simpul dan simpul turunannya yang dibaca dari pembaca. Jenis runtime node ditentukan oleh jenis node (NodeType) dari node pertama yang ditemui di pembaca.

Pengecualian

XmlReader tidak diposisikan pada jenis node yang dikenali.

Yang mendasar XmlReader melemparkan pengecualian.

Contoh

Contoh ini menggunakan file XML berikut, bernama Source.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>

Contoh berikut membuat metode sumbu kustom yang menggunakan ReadFrom lalu mengkueri sumbu kustom dengan menggunakan kueri LINQ:

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

Contoh ini mencetak output berikut:

bbb  
ccc  

Keterangan

Anda dapat menggunakan metode ini untuk menulis metode yang mengembalikan kumpulan simpul, menghasilkan setiap simpul saat simpul dibaca dari pembaca. Metode ini memungkinkan Anda memproses file XML yang sangat besar dengan jejak memori yang sangat kecil.

Pembaca yang Anda berikan ke metode ini mungkin melemparkan pengecualian. ReadFrom tidak menangkap semua pengecualian yang dilemparkan oleh pembaca; pengecualian yang tidak tertangani bergelembung hingga kode yang disebut ReadFrom. Secara khusus, kode Anda harus siap untuk menangani XmlException.

Untuk contoh cara mengalirkan dokumen yang lebih kompleks, lihat Cara mengalirkan fragmen XML dengan akses ke informasi header.

Operator kueri standar tertentu, seperti OrderBy, mengulang sumbernya, mengumpulkan semua data, mengurutkan, lalu akhirnya menghasilkan item pertama dalam urutan. Jika Anda menggunakan operator kueri yang mewujudkan sumbernya sebelum menghasilkan item pertama, Anda tidak akan mempertahankan jejak memori kecil.

Untuk contoh penggunaan LINQ ke XML untuk mengubah dokumen XML yang sangat besar sambil mempertahankan jejak memori kecil, lihat Cara melakukan transformasi streaming dokumen XML besar.

Berlaku untuk

Lihat juga