Ray*_*nes 3 xml go unmarshalling
我正在尝试将一些 XML 解组到具有 interface{} 类型的结构中。然而,每当我尝试运行它时,代码根本不会获取任何内容。所有其他元素似乎都工作正常,如果我将类型设置为 string 或 []byte 它将工作,但是我需要它比这更灵活。
我感兴趣的元素位于第 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>Ground floor>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>Ground floor>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>
Run Code Online (Sandbox Code Playgroud)
提供一些背景信息;我正在开发一个与供应商集成的项目,其中有时我们接收 XML 格式的数据,有时接收 JSON 格式的数据。我想构建一些可以解组两者结构的东西,而不是复制结构集。它有许多子结构,这意味着要保持两个几乎相同的结构(除了这一属性)需要做更多的工作。
当我们收到 JSON 数据时,该字段可以以字符串或数字形式给出。
我读过您无法解组到接口中,但是有人知道针对我的场景解决此问题的方法吗?
始终检查返回的错误很重要。
if err := xml.Unmarshal([]byte(xmlRawData), &xmlData); err != nil {
fmt.Println(err)
}
Run Code Online (Sandbox Code Playgroud)
你得到的错误是
cannot unmarshal into interface {}
Run Code Online (Sandbox Code Playgroud)
空接口无法解组,因为空接口没有任何导出字段来映射 xml 键/值。
不过,还是有办法绕过去的。在您的结构上实现xml.Unmarshaler接口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
}
Run Code Online (Sandbox Code Playgroud)
完整代码,播放链接: 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:}}}]}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3487 次 |
| 最近记录: |