2009-09-29 37 views
0

我有這樣的XML我想讀入一個對象層次:菜鳥是解析使用VB.NET谷歌地球的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作爲的System.Type,_ BYVAL 作爲的xmlString字符串)作爲對象

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節點上的屬性信息,反序列化工作正常,但我沒有這個選項。

您可能會注意到我的註釋掉嘗試處理Accuracy屬性,就像在Placemark節點上爲較早的ID屬性所做的那樣。

我該怎麼做才能使它與AddressDetail節點上的屬性信息一起工作?

+0

您使用的是什麼版本的.NET? – apiguy 2009-09-29 15:03:17

回答

0

試試這個:

<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