Golang中如何通过xml.Unmarshal获取XML的结构体

Golang中如何通过xml.Unmarshal获取XML的结构体 https://play.golang.org/p/PEu0kV5WW36

10 回复

谢谢

更多关于Golang中如何通过xml.Unmarshal获取XML的结构体的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


谢谢

为什么 RspEnvelope.XMLName 标签是 xml:"Envelope" 而不是 xml:"soap:Envelope"

为什么这段代码仍然可以正常工作。

https://play.golang.org/p/ZpVEXQbGvoq

看起来,命名空间可能只在存在歧义时才重要。你可能只有在做类似这样的事情时才需要命名空间:https://play.golang.org/p/0T9sy6Lv7UA

不能在结构体标签中像这样使用简短的XML名称:

`xml:"soap:Header"`

必须使用完整的命名空间URL:

`xml:"http://schemas.xmlsoap.org/soap/envelope/ Header"`

https://play.golang.org/p/AiuF95Qnamf

根据 encoding/xml Unmarshal 文档:

  • 如果 XMLName 字段关联的标签形式为 “name” 或 “namespace-URL name”,那么 XML 元素必须具有指定的名称(以及可选的命名空间),否则 Unmarshal 会返回错误。

Go Playground - The Go Programming Language

也许确实应该如此!我拿你发布的例子,把“简短”的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)
}

关键修正点:

  1. 结构体标签使用反引号(`)而不是单引号(’)
  2. 标签格式为 xml:"标签名"
  3. 根元素通过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数据到结构体了。

回到顶部