Public Class Content
    Private _ID As String

    <XmlIgnore()> Public Type As String
    <XmlIgnore()> Public LiveDate As Date
    <XmlArray("Items"), XmlArrayItem("Item", GetType(ContentItem))> _
    Public Items As New ContentItems()

    <XmlIgnore()> _
    Public Property ID() As String
        Get
            Return _ID
        End Get
        Set(ByVal Value As String)
            _ID = Value
            Dim drInfo As SqlDataReader = cmsDB.GetContentInfo(_ID)
            With drInfo
                If .Read Then
                    LiveDate = CDate(!online_date)
                    Type = CStr(!content_type)
                End If
                .Close()
            End With
        End Set
    End Property

    Public Sub Add(ByVal Name As String, ByVal Value As String)
        Items.Add(New ContentItem(Name, Value))
    End Sub

    Shared Function Load(ByVal ContentID As String) As Content
        Dim sContent As String = cmsDB.GetContent(ContentID)
        If CBool(Len(sContent)) Then
            Dim strMem As New StringReader(sContent)
            Dim xml As New XmlSerializer(GetType(Content))
            Return CType(xml.Deserialize(strMem), Content)
        End If
    End Function

    Public Sub Save()
        Dim strMem As New StringWriter()
        Dim xml As New XmlSerializer(Me.GetType)
        xml.Serialize(strMem, Me)
        cmsDB.UpdateContent(_ID, strMem.ToString, LiveDate)
    End Sub

    Public Class ContentItems
        Inherits CollectionBase
        Private Lookup As New SortedList()
        Public Sub Add(ByVal Item As ContentItem)
            Dim I As Integer = List.Add(Item)
            Lookup(Item.Name) = I
        End Sub
        Default Public ReadOnly Property Item(ByVal Index As Integer) As ContentItem
            Get
                Return CType(List.Item(Index), ContentItem)
            End Get
        End Property
        Default Public ReadOnly Property Item(ByVal Key As String) As ContentItem
            Get
                If Lookup.Contains(Key) Then
                    Return CType(List.Item(CInt(Lookup(Key))), ContentItem)
                Else
                    Return New ContentItem()
                End If
            End Get
        End Property
    End Class

    Public Class ContentItem
        <XmlAttributeAttribute()> _
        Public Name As String
        <XmlText()> _
        Public Value As String
        Public Sub New()

        End Sub
        Public Sub New(ByVal Name As String, ByVal Value As String)
            Me.Name = Name
            Me.Value = Value
        End Sub
    End Class
End Class