2016-06-11 57 views
0

我需要将以下xml转换为结构体。如何在go语言中使用encoding/xml包获取xml属性值

https://play.golang.org/p/tboi-mp06k

var data = `<Message xmlns="http://www.ncpdp.org/schema/SCRIPT" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    release="006" 
    version="010">` 

type Message struct { 
    XMLName xml.Name `xml:http://www.ncpdp.org/schema/SCRIPT "Message"` 
    release string `xml:"release,attr"` 
    version string `xml:"version,attr"` 
} 

func main() { 

    msg := Message{} 
    _ = xml.Unmarshal([]byte(data), &msg) 

    fmt.Printf("%#v\n", msg) 

}

计划输出以下: main.Message {XMLName:xml.Name {空间: “http://www.ncpdp.org/schema/SCRIPT” 本地: “消息”},释放: “” ,版本:“”} 版本和版本为空。有什么建议吗?

+1

任何解析(xml或json)仅适用于导出的字段。 “释放”和“版本”是未导出的,我想这就是为什么它们仍然是空的。 – jnmoal

+0

是的,谢谢! – user1848653

回答

0

你的结构变更为:

type Message struct { 
    XMLName xml.Name `xml:http://www.ncpdp.org/schema/SCRIPT "Message"` 
    Release string `xml:"release,attr"` 
    Version string `xml:"version,attr"` 
} 

将解决这个问题。 Go使用大小写来确定特定的标识符在您的包的上下文中是公用还是私有标识符。在您的代码中,这些字段对于xml.Unmarshal不可见,因为它不是包含代码的包的一部分。

当您将字段更改为大写字母时,它们变为公共,因此可以导出。

工作示例:https://play.golang.org/p/h8Q4t_3ctS