共用方式為


HOW TO:執行文字到 XML 的資料流轉換

更新: November 2007

處理文字檔的其中一個方法是撰寫擴充方法,該方法會使用 yield return 建構將文字檔一次串流一行。然後您可以撰寫利用延後的方式處理文字檔的 LINQ 查詢。如果您接著使用 XStreamingElement 串流輸出,您就可以使用最少量的記憶體建立文字檔到 XML 的轉換,而不必在乎來源文字檔的大小。

關於串流轉換有一些警告。在您可以處理一次整個檔案的情況下,以及您可以用行出現在來源文件中的順序處理這些行時,最適合使用串流轉換。如果您必須多次處理檔案,或者,如果您必須在處理檔案前排序行,您將會失去使用串流技術的好處。

範例

下列文字檔 People.txt 為這個範例的來源。

#This is a comment
1,Tai,Yee,Writer
2,Nikolay,Grachev,Programmer
3,David,Wright,Inventor

下列程式碼包含的擴充方法可以用延緩的方式,串流文字檔的行。

注意事項:

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

public static class StreamReaderSequence
{
    public static IEnumerable<string> Lines(this StreamReader source)
    {
        String line;

        if (source == null)
            throw new ArgumentNullException("source");
        while ((line = source.ReadLine()) != null)
        {
            yield return line;
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        StreamReader sr = new StreamReader("People.txt");
        XStreamingElement xmlTree = new XStreamingElement("Root",
            from line in sr.Lines()
            let items = line.Split(',')
            where !line.StartsWith("#")
            select new XElement("Person",
                       new XAttribute("ID", items[0]),
                       new XElement("First", items[1]),
                       new XElement("Last", items[2]),
                       new XElement("Occupation", items[3])
                   )
        );
        Console.WriteLine(xmlTree);
        sr.Close();
    }
}

此範例會產生下列輸出:

<Root>
  <Person ID="1">
    <First>Tai</First>
    <Last>Yee</Last>
    <Occupation>Writer</Occupation>
  </Person>
  <Person ID="2">
    <First>Nikolay</First>
    <Last>Grachev</Last>
    <Occupation>Programmer</Occupation>
  </Person>
  <Person ID="3">
    <First>David</First>
    <Last>Wright</Last>
    <Occupation>Inventor</Occupation>
  </Person>
</Root>

請參閱

概念

進階查詢技術 (LINQ to XML)

參考

XStreamingElement