ADO.NET提供了一種很好的功能來處理dataset和XML之間的轉換。你可以通過VS.NET在XML中形象地創建dataset schema。同一個document type definition(DTD)一樣,schema允許你驗證和創建XML文件,但相比之下使用.NET類則更加方便,它會帶給你更多使用上的靈活性。
然而DTD并非毫無用處。它是廣泛應用于非.NET程序中的Internet和數據轉換的World Wide Web Consortium(W3C)標準。為了能夠實現向后(即非.NET)兼容性,.NET Framework中包含了通過DTDs來驗證XML的性能。
然而,就算你需要在一個由Web程序生成的輸出XML文件中包含一個DTD,這種情況也是不存在的,或者即使存在,也缺乏可參考的標準文件。
而System.IO.FileStream對象能幫你解決這個問題。你可以創建一個FileStream并將DTD插入你的XML文件中,一個FileStream又引出兩種FileStream――它們分別從DTD和dataset中得到。你可以用DTD文件和一些范例XML來設計DataSet schema。VS.NET的Visual Data Set設計界面使這個工作變得很簡單,而存儲在應用程序文件夾中的DTD文件會被包含在最終形成的XML里。
這個方法用到了許多種不同的FileStreams。一種FileStream (Stream A)中包含有關DTD的信息;另一種FileStream(Stream B)用于創建最終的XML文件。Stream A會流入Stream B中;DataSet會直接流入Stream B中;然后Stream B會關閉并作為一個XML文件存入你的文件系統中。
首先應該準備的是DataSet,你可以創建一個新的基于schema的dataset,然后進行數據綁定。接下來,將DTD文件讀取到一個FileStream(Stream A)中。你可以通過創建一個FileStream對象和一個StreamReader對象來實現這一點。通過StreamReader來將文本文件讀取到FileStream中:
| Private Function GetDTD(DTDFilePath as string) As IO.FileStream Dim fsDTD As System.IO.FileStream Dim srDTD As IO.StreamReader fsDTD = New IO.FileStream(DTDFilePath, IO.FileMode.Open) srDTD = New IO.StreamReader(fsDTD) GetDTD = fsDTD End Function |
接下來要準備的是用于創建最終的輸出文件的主要FileStream (Stream B)。新建一個FileStream,然后用一個StreamWriter來創建一個新文件。此時,這個新文件被稱為Final.XML;你可以在Web程序文件夾中創建它。你需要注意IO.FileMode.Create。符合你需要的文件模式有許多種:
| Dim StreamB As System.IO.FileStream Dim swOutput As IO.StreamWriter Try StreamB = New IO.FileStream(Server.MapPath("") & "FINAL.xml",IO.FileMode.Create) Catch ex As Exception Throw End Try swOutput = New IO.StreamWriter(StreamB) |
之后要進入一個十分巧妙的環節――將Stream A的內容導入Stream B。你可以用單個字節或者字節數組來將數據導入或取出數據流。需要注意的是StreamReader有些例外,它用的是char數據,而不是字節數據。
調用你之前寫好的GetDTD函數,它將返回作為FileStream的DTD文件。然后建立一個和DTD stream同等長度的字節數組,將stream讀取到字節數組中,最后關閉它――因為你不再需要用到它了。現在所有的東西都被包含到字節數組中了:
| dim StreamA as IO.FileStream StreamA = GetDTD() Dim bytearray(StreamA.Length) As Byte StreamA.Read(bytearray, 0, StreamA.Length) StreamA.Close() |
接下來,將數據從DTD文件中取出并放入已經被創建好成為最終輸出文件的數據流中。你可以通過從數組中取出然后放入FileStream來實現這一點。取出數組中所有項目(除最后一項外)以便去掉文件中最后的字符:
| StreamB.Write(bytearray, 0, bytearray.Length - 1) |
現在你就可以將DataSet中的數據導入文件中了。DataSet中的WriteXML方法有許多覆蓋方法,比如寫入一個真實的文件中。此時你可以用將輸出文件導入一個FileStream (Stream B)的覆蓋方法:
| myDataSet.WriteXml(StreamB) |
不要忘記關閉文件數據流:StreamB.Close
一旦關閉了Stream B,你便可以從文件系統中訪問最新的Final.xml文件了。你還可以將這種方法用到其他類型的文本文件中。