views:

218

answers:

1

I have this XML that I am trying to read into an object hierarchy:

<?xml version="1.0" encoding="utf-8"?>
<kml xmlns="http://earth.google.com/kml/2.0"&gt;
  <Response>
    <name>1321 herbert street, Warren, MI</name>
    <Status>
      <code>200</code>
      <request>geocode</request>
    </Status>
    <Placemark id="p1">
      <address>Herbert St, Madison Heights, MI 48071, USA</address>
      <AddressDetails Accuracy="6" xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0">
        <Country>
          <CountryNameCode>US</CountryNameCode>
          <CountryName>USA</CountryName>
        </Country>
      </AddressDetails>
    </Placemark>
    <Placemark id="p2">
      <address>Herbert Ave, Warren, MI 48089, USA</address>
      <AddressDetails Accuracy="6" xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0">
        <Country>
          <CountryNameCode>US</CountryNameCode>
          <CountryName>USA</CountryName>
        </Country>
      </AddressDetails>
    </Placemark>
  </Response>
</kml>

Here are my objects:

Namespace GoogleAddress

    Public Class kml
        Private _Response As Response
        Public Property Response() As Response
            Get
                Return _Response
            End Get
            Set(ByVal value As Response)
                _Response = value
            End Set
        End Property
    End Class

    Public Class Response
        Private _name As String
        Public Property name() As String
            Get
                Return _name
            End Get
            Set(ByVal value As String)
                _name = value
            End Set
        End Property

        Private _Status As Status
        Public Property Status() As Status
            Get
                Return _Status
            End Get
            Set(ByVal value As Status)
                _Status = value
            End Set
        End Property

        <XmlElementAttribute("Placemark")> Public Placemark As Placemark()

    End Class

    Public Class Status
        Private _Code As Integer
        Public Property Code() As Integer
            Get
                Return _Code
            End Get
            Set(ByVal value As Integer)
                _Code = value
            End Set
        End Property

        Private _Request As String

        Public Property Request() As String
            Get
                Return _Request
            End Get
            Set(ByVal value As String)
                _Request = value
            End Set
        End Property

    End Class

    Public Class Placemark

        Private _address As String
        Private _AddressDetails As AddressDetails
        Private _ID As String

        <XmlAttributeAttribute("id")> Public Property ID() As String
            Get
                Return _ID
            End Get
            Set(ByVal value As String)
                _ID = value
            End Set
        End Property

        Public Property address() As String
            Get
                Return _address
            End Get
            Set(ByVal value As String)
                _address = value
            End Set
        End Property

        '<XmlAttributeAttribute("Accuracy")> _
        Public Property AddressDetails() As AddressDetails
            Get
                Return _AddressDetails
            End Get
            Set(ByVal value As AddressDetails)
                _AddressDetails = value
            End Set
        End Property

    End Class

    Public Class AddressDetails

        Private _Country As Country
        Public Property Country() As Country
            Get
                Return _Country
            End Get
            Set(ByVal value As Country)
                _Country = value
            End Set
        End Property

    End Class

    Public Class Country

        Private _CountryNameCode As String
        Public Property CountryNameCode() As String
            Get
                Return _CountryNameCode
            End Get
            Set(ByVal value As String)
                _CountryNameCode = value
            End Set
        End Property

        Private _CountryName As String
        Public Property CountryName() As String
            Get
                Return _CountryName
            End Get
            Set(ByVal value As String)
                _CountryName = value
            End Set
        End Property

    End Class
End Namespace

...and I am using this routine to deserialize the XML into my objects:

Public Shared Function DeSerializeFromXMLString(ByVal TypeToDeserialize As System.Type, _ ByVal xmlString As String) As Object

Dim bytes() As Byte = System.Text.Encoding.UTF8.GetBytes(xmlString)
Dim mem As MemoryStream = New MemoryStream(bytes)
Dim ser As System.Xml.Serialization.XmlSerializer = New System.Xml.Serialization.XmlSerializer(GetType(GoogleAddress.kml), "http://earth.google.com/kml/2.0")
Dim KmlResult As GoogleAddress.kml = TryCast(ser.Deserialize(mem), GoogleAddress.kml) '

Return KmlResult

End Function

The problem is when I try parse the AddressDetails node. Something about the Attributes is screwing things up and I don't know how to handle it. If I remove the attribute information on the AddressDetails nodes, the deserialization works fine, but I don't have that option.

You may notice my commented out attempt to handle Accuracy attribute like was done for the earlier ID attribute on the Placemark node.

What do I have to do to get it to work with the attribute info on the AddressDetail nodes?

A: 

Try this:

<XmlElement(elementName:="AddressDetails", Namespace:="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0")> Public Property AddressDetails() As AddressDetails
    Get
        Return _AddressDetails
    End Get
    Set(ByVal value As AddressDetails)
        _AddressDetails = value
    End Set
End Property



    <XmlAttributeAttribute("Accuracy")> Public Property Accuracy() As Integer
        Get
            Return _Accuracy
        End Get
        Set(ByVal value As Integer)
            _Accuracy = value
        End Set
    End Property
Velika