Go语言中使用innerxml编码XML是否仅适用于特定类型?
Go中
xml:",innerxml"类型差异问题解决 使用xml:",innerxml"时,string类型会直接输出值作为XML内容,但int等基本类型会被包裹在额外标签里,这是因为Go的encoding/xml包对不同类型的序列化逻辑不同:
- string类型被当作原始XML片段处理,直接插入到对应位置
- int等数值类型会先被序列化为
<Value>xxx</Value>这样的元素,再作为innerxml的内容插入
要让int类型也输出和string一致的XML结构,有两种可行方案:
方案1:将int转为string类型存储
直接把数值转成string后赋值给带innerxml标签的字段,示例代码:
package main import ( "encoding/xml" "fmt" ) type TestString struct { XMLName xml.Name `xml:"test"` Value string `xml:",innerxml"` } type TestInt struct { XMLName xml.Name `xml:"test"` Value string `xml:",innerxml"` } func main() { // string类型示例 ts := TestString{Value: "123"} out, _ := xml.MarshalIndent(ts, "", " ") fmt.Println(string(out)) // int转string后使用 ti := TestInt{Value: fmt.Sprintf("%d", 456)} out, _ = xml.MarshalIndent(ti, "", " ") fmt.Println(string(out)) }
方案2:自定义实现xml.Marshaler接口的类型
通过自定义类型控制序列化行为,让数值直接输出为纯文本,示例代码:
package main import ( "encoding/xml" "fmt" ) type RawInt int // 自定义MarshalXML方法,直接输出数值的字符串形式 func (r RawInt) MarshalXML(e *xml.Encoder, start xml.StartElement) error { return e.EncodeElement(fmt.Sprintf("%d", r), start) } type TestCustomInt struct { XMLName xml.Name `xml:"test"` Value RawInt `xml:",innerxml"` } func main() { ti := TestCustomInt{Value: 789} out, _ := xml.MarshalIndent(ti, "", " ") fmt.Println(string(out)) }
两种方案都能让int类型生成的XML结构和string类型一致,输出为<test>xxx</test>形式,不会额外生成包裹标签。
内容的提问来源于stack exchange,提问作者Søren Nielsen
相关产品推荐
相关产品推荐

