尝试使用encoding/xml
包
import (
"fmt"
"encoding/xml"
)
var data = `
<Patient>
<Name>
<LastName>Biscayne</LastName>
<FirstName>Sophia</FirstName>
</Name>
<Gender>F</Gender>
<CommunicationNumbers>
<Communication>
<Number>9415551223</Number>
<Qualifier>TE</Qualifier>
</Communication>
<Communication>
<Number>4055559999</Number>
<Qualifier>TE</Qualifier>
</Communication>
</CommunicationNumbers>
</Patient>
`
type Name struct {
LastName string
FirstName string
}
type Communication struct {
Number string `xml:Number`
Qualifier string `xml:Qualifier`
}
type Patient struct {
Name Name
Gender string
CommunicationNumbers []Communication `xml:CommunicationNumbers>Communication`
}
func main() {
patient := Patient{}
_ = xml.Unmarshal([]byte(data), &patient)
fmt.Printf("%#v\n", patient)
}
我无法获得通讯号码。输出如下:
main.Patient {Name:main.Name {LastName:“Biscayne”,FirstName:“Sophia”},性别:“F”,CommunicationNumbers:[] main.Communication {main.Communication {Number:“”,Qualifier : “”}}}
答案 0 :(得分:3)
修复非常简单:您必须将路径放在引号中:
CommunicationNumbers []Communication `xml:"CommunicationNumbers>Communication"`
输出(在Go Playground上尝试):
main.Patient {Name:main.Name {LastName:“Biscayne”,FirstName:“Sophia”},性别:“F”,CommunicationNumbers:[] main.Communication {main.Communication {Number:“9415551223”,资格赛:“TE”},main.Communication {编号:“4055559999”,资格赛:“TE”}}}
实际上你总是要把它放在引号中,即使它不是路径而只是XML标签名称:
type Communication struct {
Number string `xml:"Number"`
Qualifier string `xml:"Qualifier"`
}
正如reflect.StructTag
的文档中所提到的,按照惯例,标记字符串的值是以空格分隔的key:"value"
对。 encoding/xml
包使用StructTag.Get()
方法使用此约定。如果省略引号,则不会使用您在标记中指定的名称(但将使用该字段的名称)。
在此处阅读有关struct标签的更多信息:What are the use(s) for tags in Go?