2009-09-29 5 views
0

J'ai ce code XML que je suis en train de lire dans une hiérarchie d'objets:Noob est l'analyse des données XML Google Earth en utilisant VB.NET, partie III

<?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> 

Voici mes objets:

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 

... et je me sers de cette routine pour désérialiser le XML dans mes objets:

Fonction publique partagée DeSerializeFromXMLString (ByVal TypeToDeserialize Comme System.Type, _ ByVal xmlString Comme 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

Le problème est lorsque je tente d'analyser le nœud addressdetails. Quelque chose au sujet des Attributs, c'est visser les choses et je ne sais pas comment le gérer. Si je supprime les informations d'attribut sur les nœuds AddressDetails, la désérialisation fonctionne correctement, mais je n'ai pas cette option.

Vous remarquerez peut-être que ma tentative de gestion des attributs de précision a été effectuée comme pour l'attribut ID précédent sur le nœud Placemark.

Que dois-je faire pour l'utiliser avec les informations d'attribut sur les nœuds AddressDetail?

+0

quelle version de .NET utilisez-vous? – apiguy

Répondre

0

Essayez ceci:

<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