使用go语言从xml解组数组

时间:2016-06-11 18:15:11

标签: xml go unmarshalling

尝试使用encoding/xml

解析包含数组的xml

Link to code here

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 : “”}}}

1 个答案:

答案 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?