XNode.ReadFrom(XmlReader) 方法

定義

XNodeXmlReader. 產生 。

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 An 位於節點上以讀取此 XNode

傳回

包含 XNode 從讀取器讀取的節點及其後代節點。 節點的執行時類型由讀取器中遇到的第一個節點的節點類型NodeType()決定。

例外狀況

該節點 XmlReader 並未被定位在已識別的節點類型上。

底層 XmlReader 卻拋出一個例外。

範例

本範例使用以下 XML 檔案,名為 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>

以下範例建立一個自訂軸方法,使用 ReadFrom 並透過 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

此範例會產生下列輸出:

bbb
ccc

備註

你可以用這個方法寫一個方法,回傳一組節點,每個節點在讀取器讀取時都會得到該節點。 此方法能讓您處理任意大型的 XML 檔案,且記憶體佔用量極小。

你傳遞到這個方法的讀取器可能會拋出例外。 ReadFrom 無法捕捉讀者拋出的所有例外;未處理的例外會冒泡到呼叫 ReadFrom的程式碼中。 特別是,你的程式碼應該準備好處理 XmlException

關於如何串流更複雜文件的範例,請參見 「如何串流具備標頭資訊的 XML 片段」。

某些標準查詢運算子,如 OrderBy,會迭代其來源,收集所有資料,排序,最後產生序列中的第一個項目。 如果你使用查詢運算子在產生第一個項目前就已實現來源,你就不會保留少量的記憶體佔用。

關於如何使用 LINQ 轉為 XML 轉換極大型 XML 文件並維持少量記憶體使用,請參見 「如何執行大型 XML 文件的串流轉換」。

適用於

另請參閱