2011-02-25 44 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