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>