web-dev-qa-db-fra.com

Désérialisation dans une liste sans élément conteneur en XML

Dans tous les exemples que j'ai vus d'utiliser XmlSerializer chaque fois qu'une liste ou un tableau se produit, vous avez une sorte d'élément conteneur comme ceci:

<MyXml>
  <Things>
    <Thing>One</Thing>  
    <Thing>Two</Thing>  
    <Thing>Three</Thing>  
  </Things>
</MyXml>

Cependant, le XML que j'ai n'a pas de conteneur similaire à Things ci-dessus. Il commence juste à répéter des éléments. (Par ailleurs, le XML provient en fait de l'API Geocode de Google)

Donc, j'ai XML qui ressemble à ceci:

<?xml version="1.0" encoding="UTF-8"?>
<GeocodeResponse>
  <status>OK</status>
  <result>
    <type>locality</type>
    <type>political</type>
    <formatted_address>Glasgow, City of Glasgow, UK</formatted_address>
    <address_component>
      <long_name>Glasgow</long_name>
      <short_name>Glasgow</short_name>
      <type>locality</type>
      <type>political</type>
    </address_component>
    <address_component>
      <long_name>East Dunbartonshire</long_name>
      <short_name>East Dunbartonshire</short_name>
      <type>administrative_area_level_3</type>
      <type>political</type>
    </address_component>
    <!-- etc... -->
  </result>
  <result>
    <!-- etc... -->
  </result>
  <result>
    <!-- etc... -->
  </result>
</GeocodeResponse>

Comme vous pouvez le voir à l'intérieur résultat l'élément type se répète sans aucun élément types que XmlSerializer semble attendre (ou à moins tous les documents et exemples que j'ai vus). Il en va de même pour le _address_component_.

Le code que j'ai actuellement ressemble à ceci:

[XmlRoot("GeocodeResponse")]
public class GeocodeResponse
{
    public GeocodeResponse()
    {
        this.Results = new List<Result>();
    }

    [XmlElement("status")]
    public string Status { get; set; }

    [XmlArray("result")]
    [XmlArrayItem("result", typeof(Result))]
    public List<Result> Results { get; set; }
}

Chaque fois que j'essaye de désérialiser le XML, je ne reçois aucun élément dans mon Résultat _List_.

Pouvez-vous suggérer comment je peux faire en sorte que cela fonctionne, car je ne le vois pas actuellement?

58
Colin Mackay

Utilisation

[XmlElement("result")]
public List<Result> Results { get; set; }
89
Aliostad