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

我不知道如何使这段代码工作.我只是想解析一个像这样的简单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}]

谁能告诉我为什么?

最佳答案
如果未在结构字段上放置XML注释,则将该字段的名称视为XML元素的名称.

在endoding / xml包中的Unmarshal文档中,我们可以找到以下内容:

Unmarshal maps an XML element to a struct using the following rules. In the rules, the tag of a field refers to the value associated with the key ‘xml’ in the struct field’s tag (see the example above).

  • If the XML element contains a sub-element whose name matches a
    field without any mode flags (“,attr”, “,chardata”, etc), Unmarshal
    maps the sub-element to that struct field.

匹配区分大小写,因此它会对您的情况产生影响.

我建议像这样注释结构以适合实际数据:

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

转载注明原文:使用Go解析XML,使用小写的多个元素 - 代码日志