xml - Golang 将 XML 属性解码到接口(interface)中

标签 xml go unmarshalling

我正在尝试将一些 XML 解码为具有 interface{} 类型的结构。但是,每当我尝试运行它时,代码根本无法获取任何信息。所有其他元素似乎都可以正常工作,如果我将类型设置为字符串或 []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&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>

给出一些上下文;我正在开发一个与 vendor 集成的项目,有时我们会以 XML 格式接收数据,有时以 JSON 格式接收数据。我想构建一些可以为两者解码结构的东西,而不是复制结构集。它有许多子结构,这意味着要保留 2 个除了这个属性外几乎相同的结构需要做更多的工作。

当我们收到 JSON 数据时,该字段可以是字符串或数字。

我了解到您无法解码到接口(interface)中,但是有人知道针对我的场景解决此问题的方法吗?

最佳答案

始终检查返回的错误很重要。

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

你得到的错误是

cannot unmarshal into interface {}

空接口(interface)无法解码,因为空接口(interface)没有任何导出字段来映射 xml 键/值。

但是有办法绕过。实现 xml.Unmarshaler VendorMapInfo 结构上的接口(interface)。

示例:您更新的代码

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:}}}]}

关于xml - Golang 将 XML 属性解码到接口(interface)中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45333364/

相关文章:

Golang yaml.v2 将数组编码为序列

c# - 具有多个不同文本元素的 XML 元素

json - 如何通过去提取 repo 协议(protocol)的 stargazers_count 来提取 json api?

json - 如何从 URL 解析 JSON

for-loop - 如何检查for循环内的唯一性?

c# - 将结构编码(marshal)到指针时出现 "Attempted to read of write protected memory..."错误

java - 使用 Document 而不是 StreamSource 解码 xml

Java 类到 XSD

xml - 正则表达式:删除 xml 的空元素标记

javascript - 基于XML文件的页面生成(PHP、Jquery)