Golang将XML属性解组到接口中
我正在尝试将一些XML解组到一个接口类型为{}的结构中。然而,每当我尝试运行它时,代码根本就没有接收到任何东西。所有其他元素似乎都可以正常工作,如果我将类型设置为string或[]byte,它将正常工作,但是我需要它更灵活 我感兴趣的元素是第32行-FloorRefIDGolang将XML属性解组到接口中,xml,go,unmarshalling,Xml,Go,Unmarshalling,我正在尝试将一些XML解组到一个接口类型为{}的结构中。然而,每当我尝试运行它时,代码根本就没有接收到任何东西。所有其他元素似乎都可以正常工作,如果我将类型设置为string或[]byte,它将正常工作,但是我需要它更灵活 我感兴趣的元素是第32行-FloorRefID 提供一些背景;我正在从事一个与供应商集成的项目,在该项目中,有时我们接收XML格式的数据,有时接收JSON格式的数据。我想构建一个可以为两者解包结构的东西,而不是复制结构集。它有许多子结构,这意味着除了这一个属性外,要保持
提供一些背景;我正在从事一个与供应商集成的项目,在该项目中,有时我们接收XML格式的数据,有时接收JSON格式的数据。我想构建一个可以为两者解包结构的东西,而不是复制结构集。它有许多子结构,这意味着除了这一个属性外,要保持两个几乎相同的结构需要做很多工作
当我们收到JSON数据时,字段可以作为字符串或数字给出
我已经读到,您无法解组到接口中,但是有人知道我的场景中解决此问题的方法吗?始终检查返回的错误非常重要
if err := xml.Unmarshal([]byte(xmlRawData), &xmlData); err != nil {
fmt.Println(err)
}
你得到的错误是
cannot unmarshal into interface {}
无法对空接口进行解组,因为该空接口没有任何可将xml键/值映射到的导出字段
不过,还是有办法的。在VendorMapInfo
结构上实现接口
示例:更新的代码
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
}
完整代码,播放链接:
输出:
{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:}}}]}
请在问题本身中包含您的Go代码,而不是链接到它。
{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:}}}]}