共用方式為


HOW TO:從 XmlReader 串流 XML 片段

更新: November 2007

當您必須處理大型 XML 檔案時,可能無法將整個 XML 樹狀結構載入記憶體中。這個主題顯示如何使用 XmlReader 串流片段。

使用 XmlReader 讀取 XElement 物件的其中一個最有效方式為,撰寫您自己自訂的座標軸方法。座標軸方法通常會傳回集合,例如,XElementIEnumerable<T>,如本主題的範例中所示。在自訂座標軸方法中,呼叫 ReadFrom 方法來建立 XML 片段後,使用 yield return 傳回集合。這會將延後執行語意 (Semantics) 提供給您自訂的座標軸方法。

當您從 XmlReader 物件建立 XML 樹狀結構時,XmlReader 必須定位在項目上。ReadFrom 方法在讀取項目的關閉標記前不會傳回。

如果您要建立部分樹狀結構,您可以具現化 XmlReader、將讀取器定位在您要轉換為 XElement 樹狀結構的節點上,然後建立 XElement 物件。

HOW TO:具有標頭資訊存取權的資料流 XML 片段主題包含如何串流更複雜文件的資訊與範例。

HOW TO:執行大型 XML 文件的資料流轉換主題包含使用 LINQ to XML 轉換非常大的 XML 文件,同時維護小的記憶體使用量的範例。

範例

這個範例會建立自訂座標軸方法。您可以使用 LINQ 查詢進行查詢。自訂座標軸方法 StreamRootChildDoc 是一種方法,特別針對讀取具有重複 Child 項目的文件而設計。

注意事項:

下列範例使用 C# 的 yield return 建構函式。在 Visual Basic 2008 中沒有同等的功能,因此,只有在 C# 中提供這個範例。

static IEnumerable<XElement> StreamRootChildDoc(StringReader stringReader)
{
    using (XmlReader reader = XmlReader.Create(stringReader))
    {
        reader.MoveToContent();
        // Parse the file and display each of the nodes.
        while (reader.Read())
        {
            switch (reader.NodeType)
            {
                case XmlNodeType.Element:
                    if (reader.Name == "Child") {
                        XElement el = XElement.ReadFrom(reader) as XElement;
                        if (el != null)
                            yield return el;
                    }
                    break;
            }
        }
    }
}

static void Main(string[] args)
{
    string markup = @"<Root>
      <Child Key=""01"">
        <GrandChild>aaa</GrandChild>
      </Child>
      <Child Key=""02"">
        <GrandChild>bbb</GrandChild>
      </Child>
      <Child Key=""03"">
        <GrandChild>ccc</GrandChild>
      </Child>
    </Root>";

    IEnumerable<string> grandChildData =
        from el in StreamRootChildDoc(new StringReader(markup))
        where (int)el.Attribute("Key") > 1
        select (string)el.Element("GrandChild");

    foreach (string str in grandChildData) {
        Console.WriteLine(str);
    }
}

此範例會產生下列輸出:

bbb
ccc

在此範例中,來源文件很小。但是,即使有數百萬的 Child 元素,此範例的記憶體使用量還是很小。

請參閱

概念

剖析 XML