盡管你可以通過schema來驗證和創建XML文件,但相比之下使用.NET類則更加 方便,它會帶給你更多使用上的靈活性。
技術工具箱: VB.NET, XML, ADO.NET
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
然而,就算你需要在一個由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文件了。 你還可以將這種方法用到其他類型的文本文件中。