2017-07-26 6 views
1

J'essaie de démasquer du code XML dans une structure avec un type d'interface {}. Cependant, chaque fois que j'essaie de l'exécuter, le code ne ramasse rien du tout. Tous les autres éléments semblent fonctionner correctement, et si je mets le type à string ou à [] byte cela fonctionnera, mais j'en ai besoin pour être plus flexible que ça.Golang unmarshal Attribut XML dans l'interface

L'élément que je suis intéressé est sur la ligne 32 -FloorRefID

https://play.golang.org/p/Ehr8qx1aWf

<?xml version="1.0" encoding="UTF-8"?> 
    <Locations totalPages="1" currentPage="1" pageSize="25"> 
     <WirelessClientLocation macAddress="00:00:00:00:00:00"> 
      <MapInfo mapHierarchyString="Head office&gt;Ground floor&gt;Store" floorRefId="-1122334455667789"> 
      <Image imageName="floorPlan1.png" /> 
      </MapInfo> 
      <MapCoordinate x="2850" y="3000" unit="FEET" /> 
     </WirelessClientLocation> 
     <WirelessClientLocation macAddress="11:11:11:11:11:11"> 
      <MapInfo mapHierarchyString="Head office&gt;Ground floor&gt;Store" floorRefId="-1122334455667789"> 
      <Image imageName="floorPlan1.png" /> 
      </MapInfo> 
      <MapCoordinate x="10.72" y="76.49" unit="FEET" /> 
     </WirelessClientLocation> 
     <WirelessClientLocation macAddress="26:cd:96:46:0b:2b"> 
      <MapInfo floorRefId="0" /> 
      <MapCoordinate x="51.52" y="4.2" unit="FEET" /> 
     </WirelessClientLocation> 
    </Locations> 

Pour donner un peu de contexte; Je travaille sur un projet d'intégration avec un fournisseur dans lequel nous recevons parfois les données en XML et parfois en JSON. Je voulais construire quelque chose qui pourrait démembrer la structure pour les deux, plutôt que de dupliquer l'ensemble de la structure. Il a beaucoup de sous-structures ce qui signifie que c'est beaucoup plus de travail pour garder 2 structures qui sont presque identiques à l'exception de cet attribut.

Lorsque nous recevons les données JSON, le champ peut être donné sous la forme d'une chaîne ou d'un nombre.

J'ai lu que vous ne pouvez pas démarshal dans une interface, mais quelqu'un sait-il un moyen de contourner ce problème pour mon scénario?

+0

S'il vous plaît inclure votre code Aller dans la question elle-même plutôt que de lier à elle. – Adrian

Répondre

2

Il est important de toujours vérifier l'erreur retournée.

if err := xml.Unmarshal([]byte(xmlRawData), &xmlData); err != nil { 
    fmt.Println(err) 
} 

L'erreur que vous obtenez est

cannot unmarshal into interface {} 

Interface vide ne peut pas être unmarshalled depuis l'interface vide n'a pas de champs exportés pour cartographier les clés XML/valeurs à.

Cependant il y a moyen de se déplacer. Implémentation de l'interface xml.Unmarshaler sur votre structure VendorMapInfo.

Exemple: Votre code mis à jour

type VendorMapInfo struct { 
    MapHierarchyString string  `xml:"mapHierarchyString,attr"` 
    FloorRefID   interface{} `xml:"floorRefId,attr"` 
    Image    Image  `xml:"Image"` 
    FloorDimension  VendorFloorDimension 
} 

type Image struct { 
    Name string `xml:"imageName,attr"` 
} 

func (mf *VendorMapInfo) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { 
    // Attributes 
    for _, attr := range start.Attr { 
     switch attr.Name.Local { 
     case "mapHierarchyString": 
      mf.MapHierarchyString = attr.Value 
     case "floorRefId": 
      mf.FloorRefID = findFloorRefIDType(attr.Value) 
     } 
    } 

    for { 
     token, err := d.Token() 
     if err != nil { 
      return err 
     } 

     switch el := token.(type) { 
     case xml.StartElement: 
      if el.Name.Local == "Image" { 
       item := new(Image) 
       if err = d.DecodeElement(item, &el); err != nil { 
        return err 
       } 
       mf.Image = *item 
      } 
     case xml.EndElement: 
      if el == start.End() { 
       return nil 
      } 
     } 
    } 

    return nil 
} 

Code complet, lien jouer: https://play.golang.org/p/wZQOsQv0Nq

Sortie:

{Locations:{Space: Local:} WirelessClientLocation:[{MacAddress:00:00:00:00:00:00 MapInfo:{MapHierarchyString:Head office>Ground floor>Store FloorRefID:-1122334455667789 Image:{Name:floorPlan1.png} FloorDimension:{Length:0 Width:0 Height:0 OffsetX:0 OffsetY:0 Unit:}}} {MacAddress:11:11:11:11:11:11 MapInfo:{MapHierarchyString:Head office>Ground floor>Store FloorRefID:-1122334455667789 Image:{Name:floorPlan1.png} FloorDimension:{Length:0 Width:0 Height:0 OffsetX:0 OffsetY:0 Unit:}}} {MacAddress:26:cd:96:46:0b:2b MapInfo:{MapHierarchyString: FloorRefID:0 Image:{Name:} FloorDimension:{Length:0 Width:0 Height:0 OffsetX:0 OffsetY:0 Unit:}}}]}