2017-07-26 10 views
1

インタフェース{}型の構造体にXMLをアンマーシャリングしようとしています。しかし、私はそれを実行しようとするたびに、コードは何もピックアップしません。他のすべての要素は正常に動作するように見えますが、型を文字列または[]バイトに設定すると動作しますが、それ以上の柔軟性が必要です。GolangのインタフェースへのXML属性の非整列

私が興味を持っての要素が32ライン上にある - は、いくつかのコンテキストを与えるために

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> 

をFloorRefID。私はベンダーとの統合プロジェクトに取り組んでいます。このプロジェクトでは、データをXMLとして、また時にはJSONとして受け取ることがあります。私は、構造体を複製するのではなく、両方の構造体を非整列化できるものを構築したかったのです。それは、この1つの属性を除いてほぼ同じ2つの構造を保つためにはるかに多くの作業が必要であることを意味する多くの部分構造を持っています。

JSONデータを受け取ると、そのフィールドは文字列または数字で指定できます。

私はインターフェイスに非整列化することはできませんが、私のシナリオでこの問題を回避する方法を知っている人はいますか?

+0

質問自体ではなく、それへのリンクでご囲碁コードを記載してください。 – Adrian

答えて

2

返されたエラーを常にチェックすることが重要です。空のインターフェイスは、XMLのキー/値をマッピングするために、エクスポートされたフィールドを持っていないので、

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

あなたが取得しているエラーが

cannot unmarshal into interface {} 

空のインタフェースが非整列化することができないです。

しかし、回避する方法があります。 VendorMapInfo構造体にxml.Unmarshalerインターフェイスを実装しています。

例:あなたの更新されたコード

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 
} 

完全なコード、リンクを演じる:https://play.golang.org/p/wZQOsQv0Nq

出力:

{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:}}}]} 
関連する問題