Нуб анализирует XML-данные Google Планета Земля с помощью VB.NET, часть III
У меня есть этот XML, который я пытаюсь прочитать в иерархию объектов:
<?xml version="1.0" encoding="utf-8"?>
<kml xmlns="http://earth.google.com/kml/2.0">
<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>
Вот мои объекты:
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
... и я использую эту процедуру для десериализации XML в мои объекты:
Открытая общая функция DeSerializeFromXMLString(ByVal TypeToDeserialize As System.Type, _ ByVal xmlString As String) как объект
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
Конечная функция
Проблема в том, когда я пытаюсь разобрать узел AddressDetails. Что-то в Атрибутах все испортило, и я не знаю, как с этим справиться. Если я удаляю информацию об атрибутах на узлах AddressDetails, десериализация работает нормально, но у меня нет этой опции.
Вы можете заметить мою закомментированную попытку обработки атрибута точности, как это было сделано для более раннего атрибута идентификатора на узле меток.
Что мне нужно сделать, чтобы заставить его работать с информацией об атрибутах на узлах AddressDetail?
1 ответ
Попробуй это:
<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