构建XML的内部类 - 如何将外部类放在一起?

时间:2011-02-25 17:21:39

标签: .net xml vb.net

我正在尝试创建一个类,其最终结果是创建一个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中正确显示。

3 个答案:

答案 0 :(得分:2)

您出于此目的没有使用Data Contracts的原因吗?

它允许您向应该序列化的类/成员添加属性,描述它应该如何序列化。

如果数据合同不支持您对所需XML输出的所有控制,您还可以考虑using XmlSerializer

答案 1 :(得分:1)

我已经看过两件事。

我建议传递XMLTextWriter的实例,或者更好的是,传递一些仅限内部的结构。创建XML编写器类似于编写编译器,其中您将拥有表示文档/文本文件中特定点的所有内容状态的变量,例如,已打开的括号数,任何本地ID引用当前范围等。如果你试图简单地传回文本/字符串结果,你仍然必须在某处记录这些变量 - 它们可能是你对象中的全局变量。

还有一个性能考虑因素。使用传递的对象,可以将每个新的文本位添加到数组或列表中,然后使用最后的String.Join将它们组合在一起。这比传递一些文本快得多,在你得到它们的时候慢慢地组合每个部分,不断地要求并释放足够大的内存来保存整个结果。

总之,你的第一个想法是更好的。

答案 2 :(得分:1)

生成强类型数据集。然后使用您输入此类型数据集的代码。因此,您可以使用类型化数据集中的方法来执行XML所需的操作。

了解如何在此链接中Generating a Strongly Typed DataSet