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

下面的片段,


package main

import (

    "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。

  1. 我无法在构造函数中分配它,因为我不知道数组中的元素数量。

  2. 我无法使用UnmarshalerAttr在解组期间实现和分配的自定义类型,因为如果缺少该属性,UnmarshalXMLAttr则不会运行。

  3. 我可以让它成为一个指针,然后检查是否为 nil,然后为 true,但这只是粗暴且容易出错的。

我该怎么做呢?


慕姐4208626
浏览 240回答 1
1回答

扬帆大鱼

你是对的,你不能用UnmarshalerAttr这个。相反,ResultItem可以实现Unmarshaler这将允许您设置默认属性值:package mainimport (&nbsp; &nbsp; "encoding/xml"&nbsp; &nbsp; "fmt")type ResultItem struct {&nbsp; Value string `xml:"value,attr"`&nbsp; Flag bool `xml:"flag,attr"`}func (ri *ResultItem) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {&nbsp; type resultItem ResultItem // new type to prevent recursion&nbsp; item := resultItem{&nbsp; &nbsp; Flag: true,&nbsp; }&nbsp; if err := d.DecodeElement(&item, &start); err != nil {&nbsp; &nbsp; return err&nbsp; }&nbsp; *ri = (ResultItem)(item)&nbsp; return nil}func main() {&nbsp; &nbsp; var r struct {&nbsp; &nbsp; &nbsp; Item[] ResultItem `xml:"item"`&nbsp; &nbsp; }&nbsp; &nbsp; xml.Unmarshal([]byte(`&nbsp; &nbsp; &nbsp; &nbsp; <result x="ASDASD">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <item value="1" flag="false" />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <item value="2" flag="true" />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <item value="3" />&nbsp; &nbsp; &nbsp; &nbsp; </result>`,&nbsp; &nbsp; ), &r)&nbsp; &nbsp; fmt.Printf("%+v\n", r)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go