使用Go解析XML,具有多个小写元素

3

我不知道如何让这段代码工作。我只是试图解析一个简单的XML文件,例如:

package main

import (
    "encoding/xml"
    "fmt"
)

type Data struct {
    XMLName xml.Name `xml:"data"`
    Nam     string   `xml:"nam,attr"`
}

type Struct struct {
    XMLName xml.Name `xml:"struct"`
    Data    []Data
}

func main() {

    x := `  
        <struct>
            <data nam="MESSAGE_TYPE">     
            </data>
            <data nam="MESSAGE_TYPE2">
            </data>
        </struct>
    `
    s := Struct{}
    err := xml.Unmarshal([]byte(x), &s)
    if err != nil {
        panic(err)
    }
    fmt.Printf("%v\n", s)
    fmt.Println(s.Data)
}

我收到的是:

{{ struct} []}
[]

但是当我把"data"元素改成大写字母时,如下所示:

package main

import (
    "encoding/xml"
    "fmt"
)

type Data struct {
    XMLName xml.Name `xml:"Data"`
    Nam     string   `xml:"nam,attr"`
}

type Struct struct {
    XMLName xml.Name `xml:"struct"`
    Data    []Data
}

func main() {

    x := `  
        <struct>
            <Data nam="MESSAGE_TYPE">     
            </Data>
            <Data nam="MESSAGE_TYPE2">
            </Data>
        </struct>
    `
    s := Struct{}
    err := xml.Unmarshal([]byte(x), &s)
    if err != nil {
        panic(err)
    }
    fmt.Printf("%v\n", s)
    fmt.Println(s.Data)
}

我得到了这个:

{{ struct} [{{ Data} MESSAGE_TYPE} {{ Data} MESSAGE_TYPE2}]}
[{{ Data} MESSAGE_TYPE} {{ Data} MESSAGE_TYPE2}]

有人能告诉我为什么吗?

1个回答

7
如果在结构体字段上没有放置XML注释,则该字段的名称将作为XML元素的名称。
在endocing/xml包中的Unmarshal文档中,我们可以找到以下内容:
Unmarshal使用以下规则将XML元素映射到结构体。在规则中,字段的标记指的是与结构体字段标记中的“xml”键关联的值(见上面的示例)。
- 如果XML元素包含与无模式标志(“,attr”,“,chardata”等)匹配的字段的子元素,则Unmarshal将子元素映射到该结构体字段。
匹配区分大小写,因此在您的情况下会有所不同。
我建议像这样注释结构以适应实际数据:
type Struct struct {
    XMLName xml.Name `xml:"struct"`
    Data    []Data   `xml:"data"`
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接