2014-11-02 87 views
3

我不知道如何使这个代码工作。我只是试图解析这样一个简单的XML文件:用Go解析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} []} 
[] 

但是,当我改变“数据”元素为大写,如:

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}] 

有人可以告诉我为什么吗?

回答

6

如果不在结构字段上放置XML注释,则该字段的名称将作为XML元素的名称。

在endoding/XML包上Unmarshal的文档,我们可以发现以下几点:

解组XML元素映射到使用下面的规则结构。在规则中,字段的标记引用与struct字段标记中的键'xml'关联的值(请参见上面的示例)。

  • 如果XML元素包含一个子元素,其名称的 场比赛没有任何模式的标志(“ATTR”,“chardata”等),解组 子元素映射到结构领域。

匹配是这样它使你的情况的不同区分大小写。

我建议注释这样的结构,以适应实际的数据:

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