为了账号安全,请及时绑定邮箱和手机立即绑定

进行 XML 解析:将缺失的属性设置为“true”

进行 XML 解析:将缺失的属性设置为“true”

Go
慕姐4208626 2021-08-30 16:28:09
下面的片段,package mainimport (    "encoding/xml"    "fmt")func main() {    var r struct {        Item []struct {            Value string `xml:"value,attr"`            Flag bool `xml:"flag,attr"`        } `xml:"item"`    }    xml.Unmarshal([]byte(`        <result>            <item value="1" flag="false" />            <item value="2" flag="true" />            <item value="3" />        </result>`,    ), &r)    fmt.Printf("%+v\n", r)}将打印以下结果:{Item:[{Value:1 Flag:false} {Value:2 Flag:true} {Value:3 Flag:false}]}在某些元素中,flag属性将丢失(例如上面的第 3 项),但我希望它采用默认值true, 而不是false。我无法在构造函数中分配它,因为我不知道数组中的元素数量。我无法使用UnmarshalerAttr在解组期间实现和分配的自定义类型,因为如果缺少该属性,UnmarshalXMLAttr则不会运行。我可以让它成为一个指针,然后检查是否为 nil,然后为 true,但这只是粗暴且容易出错的。我该怎么做呢?
查看完整描述

1 回答

?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

你是对的,你不能用UnmarshalerAttr这个。相反,ResultItem可以实现Unmarshaler这将允许您设置默认属性值:


package main

import (

    "encoding/xml"

    "fmt"

)


type ResultItem struct {

  Value string `xml:"value,attr"`

  Flag bool `xml:"flag,attr"`

}


func (ri *ResultItem) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {

  type resultItem ResultItem // new type to prevent recursion

  item := resultItem{

    Flag: true,

  }

  if err := d.DecodeElement(&item, &start); err != nil {

    return err

  }

  *ri = (ResultItem)(item)

  return nil

}


func main() {

    var r struct {

      Item[] ResultItem `xml:"item"`

    }

    xml.Unmarshal([]byte(`

        <result x="ASDASD">

            <item value="1" flag="false" />

            <item value="2" flag="true" />

            <item value="3" />

        </result>`,

    ), &r)

    fmt.Printf("%+v\n", r)

}



查看完整回答
反对 回复 2021-08-30
  • 1 回答
  • 0 关注
  • 239 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信