2011-02-25 81 views
1

我想創建一個類,其最終結果是創建一個XML文檔。目前,該類由嵌套類組成,每個類構建XML文檔的一部分。我所關心的是我應該如何將內部類的結果與最終輸出結合起來。構建XML的內部類 - 如何讓外部類將它們放在一起?

外部類應該將XmlTextWriter的實例傳遞給構建特定節的每個內部類,還是每個內部類只需輸出XML的字符串表示形式,而外部類可以將它們組合在一起?

我已經把一個小例子來幫助說明...

Public Class PatientInfoBuilder 

    'Instance of XmlTextWriter pass to each class' 
    Private writer as XmlTextWriter 

    'This class builds XML containing Patient first name, last name, etc ..' 
    Private Class PatientInfo 

    Private mWriter as XmlTextWriter 

    'Constructor accepts XmlTextWriter instance' 
    Public Sub New(ByRef writer as XmlTextWriter) 
     mWriter = writer 
    End Sub 

    Public Sub BuildXML() 
     mWriter.WriteStartElement('FirstName') 
     ... 
     ... 
     mWriter.WriteEndElement() 
    End Sub 

    End Class 

    'This class builds a list of patient medications' 
    Private Class PatientMedications 

    Private mWriter as XmlTextWriter 

    'Constructor accepts XmlTextWriter instance' 
    Public Sub New(ByRef writer as XmlTextWriter) 
     mWriter = writer 
    End Sub 


    Public Sub BuildXML() 
     mWriter.WriteStartElement('Medication') 
     ... 
     ... 
     mWriter.WriteEndElement() 
    End Sub 

    End Class 

End Class 

的代碼是不完整的,但我希望它給的什麼,我試圖完成一個想法。我需要找到一種方法來將XML部分收集在一起以作爲單個文檔輸出。我的例子是在VB.NET中,但在C#中的答案也是受歡迎的。感謝您的任何建議。

**請注意,據我所知,有評論尾隨撇號。我這樣做是爲了讓顏色編碼標記在SO中正確顯示。

+0

您使用的是什麼版本的.NET?除非你仍然使用.NET 1.1,否則不應該使用'XmlTextWriter'。改爲使用'XmlWriter'(和'XmlWriter.Create')。 – 2011-02-25 19:37:13

回答

1

我已經看到兩者都完成了。

我建議繞過XmlTextWriter的,或實例更好,但一些內部專用結構。創建一個XML編寫器類似於編寫一個編譯器,在這個編譯器中,變量將表示文檔/文本文件中某個特定位置處的所有內容的狀態,例如,已經打開的括號的數量,以及任何本地ID引用當前範圍等。如果您試圖簡單地傳回文本/字符串結果,您仍然必須在某處記錄這些變量 - 它們可能是您的對象中的全局變量。

還有一個性能問題。通過傳遞的對象,您可以將每個新的文本位添加到數組或列表中,然後在末尾使用String.Join進行組合。這比傳遞幾個文本要快得多,在獲取它們時緩慢地組合每個部分,不斷要求並釋放足夠大的內存,以便在整個過程的任何時間保存整個結果。

總之,你的第一個想法是最好的一個。

+0

非常感謝! – webworm 2011-02-25 18:31:35

+0

不應該直接使用'XmlTextWriter'。如果應該傳遞任何東西,它應該是'XmlWriter'。 – 2011-02-25 19:38:22

2

不使用Data Contracts用於此目的的任何原因?

它可以讓你的屬性添加到您的類/成員應序列化,描述它應該如何序列化。

當數據合約不支持遍佈您需要的XML輸出的控制,你也可以考慮using XmlSerializer

+0

恐怕我對數據契約根本不熟悉。 – webworm 2011-02-25 17:43:22

+0

@webworm:我建議你快速閱讀一些教程,看看他們可以幫助你。如果它適合你的目的,你可以節省時間。 – 2011-02-25 17:51:20

1

生成強類型數據集。然後在你的代碼中引用這個類型化的數據集。所以你可以使用類型化數據集中的方法來做你想要的XML。

查看如何在此鏈接Generating a Strongly Typed DataSet

相關問題