首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

.NET FileStream 實戰:將 DTD 內嵌至 XML 檔案的完整方案

     編輯:關於.NET

背景:為什麼仍需 DTD?

雖然 XML Schema (XSD) 功能更強、支援型別,且 .NET 類別操作更便利,但 DTD 仍是 W3C 標準,廣泛用於非 .NET 系統的資料交換。為實現向後相容,有時必須在 .NET 產出的 XML 中內嵌 DTD 宣告。

核心思路:雙重 FileStream 串流合併

  1. Stream A:讀取既有 DTD 檔案內容
  2. Stream B:建立最終輸出 XML 檔案
  3. 將 Stream A 內容寫入 Stream B → 再以 DataSet.WriteXml(StreamB) 附加資料 → 關閉 Stream B 完成輸出

步驟 1:讀取 DTD 至 FileStream (Stream A)

Private Function GetDTD(DTDFilePath As String) As IO.FileStream
    Dim fsDTD As New System.IO.FileStream(DTDFilePath, IO.FileMode.Open)
    Dim srDTD As New IO.StreamReader(fsDTD)
    ' 僅為示範讀取動作,實際只需回傳 fsDTD
    Return fsDTD
End Function

步驟 2:建立輸出用 FileStream (Stream B)

Dim StreamB As New System.IO.FileStream(
    Server.MapPath("") & "FINAL.xml",
    IO.FileMode.Create)
Dim swOutput As New IO.StreamWriter(StreamB)

FileMode.Create 會覆寫同名檔案;其他模式如 Append、OpenOrCreate 視需求選用。

步驟 3:將 DTD 內容從 Stream A 複製到 Stream B

Dim StreamA As IO.FileStream = GetDTD("path.dtd")
Dim byteArray(StreamA.Length) As Byte
StreamA.Read(byteArray, 0, StreamA.Length)
StreamA.Close()

' 寫入時排除最後一個字元(通常是 EOF 或換行),避免重複
StreamB.Write(byteArray, 0, byteArray.Length - 1)

注意:StreamReader 處理字元,而非位元組;此處直接用 FileStream.Read 處理位元組陣列更精確。

步驟 4:將 DataSet 寫入同一 Stream B

' 假設 myDataSet 已填入資料
myDataSet.WriteXml(StreamB)

' 關閉串流,完成檔案寫入
StreamB.Close()

WriteXml 多載支援直接寫入 Stream,無需中繼檔案,效能最佳。

完整流程圖解

[DTD File] → StreamA (FileStream) → Byte[] → StreamB (FileStream) ← DataSet.WriteXml()
                                                      ↓
                                            [FINAL.xml] (檔案系統)

擴充應用

此模式同樣適用於:

  • 在 XML 前加入 XML 宣告 <?xml version="1.0"?>
  • 合併多個文字檔片段(如 Header + Body + Footer)
  • 任何需「串流管線式」組合文字內容的場景

關鍵提醒

  1. 務必 Close() 或 Dispose() 所有串流,釋放檔案鎖定。
  2. 大檔案建議改用 BufferedStream 或分塊讀寫,避免記憶體壓力。
  3. 編碼一致性:確認 DTD、XML、DataSet 輸出編碼皆為 UTF-8(或指定編碼)。

結語

善用 FileStream 的可組合性,即可在 .NET 中優雅地實現「DTD 內嵌 XML」,滿足跨平台相容需求,同時保持程式碼簡潔高效。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved