Golang中如何通过xml.Unmarshal获取XML的结构体
Golang中如何通过xml.Unmarshal获取XML的结构体 https://play.golang.org/p/PEu0kV5WW36
谢谢
为什么 RspEnvelope.XMLName 标签是 xml:"Envelope" 而不是 xml:"soap:Envelope"
如何获取 envelope.Body https://play.golang.org/p/UK2ghMF0Wr-
为什么这段代码仍然可以正常工作。
看起来,命名空间可能只在存在歧义时才重要。你可能只有在做类似这样的事情时才需要命名空间:https://play.golang.org/p/0T9sy6Lv7UA
不能在结构体标签中像这样使用简短的XML名称:
`xml:"soap:Header"`
必须使用完整的命名空间URL:
`xml:"http://schemas.xmlsoap.org/soap/envelope/ Header"`
根据 encoding/xml Unmarshal 文档:
- 如果 XMLName 字段关联的标签形式为 “name” 或 “namespace-URL name”,那么 XML 元素必须具有指定的名称(以及可选的命名空间),否则 Unmarshal 会返回错误。
也许确实应该如此!我拿你发布的例子,把“简短”的XML命名空间声明替换成了它们的完整定义。RspEnvelope.XMLName 没有命名空间,所以当我做替换时,没有发现它。
// RspEnvelope 是一个 SOAP 信封。
type RspEnvelope struct {
XMLName xml.Name `xml:"Envelope"`
如果它应该在一个命名空间里,我建议像替换其他命名空间那样,也给它加上一个。
在这个论坛上,我常常只是试图充当“另一双眼睛”,希望能帮助提问者和我自己都成为更好的程序员!
在Golang中,通过xml.Unmarshal解析XML到结构体需要正确配置结构体标签。根据你提供的代码,主要问题是结构体字段标签的格式不正确。
以下是修正后的示例代码:
package main
import (
"encoding/xml"
"fmt"
)
type Person struct {
XMLName xml.Name `xml:"person"`
Name string `xml:"name"`
Age int `xml:"age"`
Email string `xml:"email"`
}
func main() {
xmlData := []byte(`
<person>
<name>John Doe</name>
<age>30</age>
<email>john@example.com</email>
</person>
`)
var person Person
err := xml.Unmarshal(xmlData, &person)
if err != nil {
fmt.Printf("Error unmarshaling XML: %v\n", err)
return
}
fmt.Printf("Name: %s\n", person.Name)
fmt.Printf("Age: %d\n", person.Age)
fmt.Printf("Email: %s\n", person.Email)
}
关键修正点:
- 结构体标签使用反引号(`)而不是单引号(’)
- 标签格式为
xml:"标签名" - 根元素通过
XMLName字段指定
对于嵌套XML结构,可以这样处理:
type Address struct {
City string `xml:"city"`
Country string `xml:"country"`
}
type Person struct {
XMLName xml.Name `xml:"person"`
Name string `xml:"name"`
Age int `xml:"age"`
Address Address `xml:"address"`
}
func main() {
xmlData := []byte(`
<person>
<name>John Doe</name>
<age>30</age>
<address>
<city>New York</city>
<country>USA</country>
</address>
</person>
`)
var person Person
xml.Unmarshal(xmlData, &person)
fmt.Printf("City: %s\n", person.Address.City)
}
对于XML属性,使用attr标签:
type Person struct {
XMLName xml.Name `xml:"person"`
ID string `xml:"id,attr"`
Name string `xml:"name"`
}
这样就能正确解析XML数据到结构体了。


