package main
import (
"encoding/xml"
"fmt"
)
func main() {
xr := &xmlResponse{}
if err := xml.Unmarshal([]byte(x), &xr); err != nil {
panic(err)
}
fmt.Printf("%+v", xr)
}
type xmlResponse struct {
//Title string `xml:"title,omitempty"`
Title struct {
BoldWords []struct {
Bold string `xml:",chardata"`
} `xml:"bold,omitempty"`
Title string `xml:",chardata" `
} `xml:"title,omitempty"`
}
var x = `<?xml version="1.0" encoding="utf-8"?>
<mytag version="1.0">
<title><bold>Go</bold> is a programming language. I repeat: <bold>Go</bold> is a programming language.</title>
</mytag>`
这将输出:
&{Title:{BoldWords:[{Bold:Go} {Bold:Go}] Title: is a programming language. I repeat: is a programming language.}}
我如何获得:
<bold>Go</bold> is a programming language. I repeat: <bold>Go</bold> is a programming language.
换句话说,我不仅需要标签,而且还需要将它们保存在正确的位置,而不仅仅是一片粗体。尝试以字符串的形式获取它(例如,取消注释xmlResponse结构中的第一个“标题”),从而完全删除了加粗的项目。
答案 0 :(得分:3)
从Docs
如果XML元素包含字符数据,则该数据为
累积在具有标签“,chardata”的第一个结构字段中。的 struct字段的类型可以为[] byte或字符串。如果没有这样的话 字段,字符数据将被丢弃。
这实际上不是您想要的,您正在寻找的是:
如果结构的字段类型为[] byte或带有标签的字符串
“,innerxml”,Unmarshal会累积嵌套在
内部的原始XML。 该字段中的元素。其余规则仍然适用。
因此,请使用innerxml
而不是chardata
。
package main
import (
"encoding/xml"
"fmt"
)
func main() {
xr := &xmlResponse{}
if err := xml.Unmarshal([]byte(x), &xr); err != nil {
panic(err)
}
fmt.Printf("%+v", xr)
}
type xmlResponse struct {
//Title string `xml:"title,omitempty"`
Title struct {
Title string `xml:",innerxml" `
} `xml:"title,omitempty"`
}
var x = `<?xml version="1.0" encoding="utf-8"?>
<mytag version="1.0">
<title><bold>Go</bold> is a programming language. I repeat: <bold>Go</bold> is a programming language.</title>
</mytag>`
输出:
&{Title:{Title:<bold>Go</bold> is a programming language. I repeat: <bold>Go</bold> is a programming language.}}