Golang中如何忽略XML中的字段

Golang中如何忽略XML中的字段 我有一个结构体

type UserData struct {
 SomeData struct {
	AnotherData []struct {
		Data1  string  `xml:"pair1" json:"pair1"`
		Data2  string  `xml:"pair2" json:"pair2"`
		Data3   float64 `xml:"rate" json:"rate"`
		InnerData struct {
			InnerData1  float64 `xml:"inner1" json:"inner1"`
			InnerData2 float64 `xml:"inner2" json:"inner2"`
		} `xml:"innerdata" json:"innerdata"`
	} `xml:"anotherdata" json:"anotherdata"`
  } `json:"somedata" xml:"somedata"`
}

当我将这个结构体编码为 XML 时,我得到以下输出

<userData>
  <someData>
    ...
  </someData>

我如何才能省略 userData?XML 应该以 someData 开始,而不是以 userData 开始。

<someData>
    ...
</someData>

更多关于Golang中如何忽略XML中的字段的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

我遇到了一个错误:xml: unsupported type: struct

更多关于Golang中如何忽略XML中的字段的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


您可以直接对内部的 SomeData 字段进行序列化。

var d UserData = ...
bs, err := xml.Marshal(&d.SomeData)

好的,那么给这个类型起个名字;

package main

import "fmt"

func main() {
    var m map[string]int
    fmt.Println(m == nil)
    m["key"] = 1
}

https://play.golang.org/p/7X2TY25AqZ6

可以通过在结构体字段上使用 xml:",innerxml" 标签来忽略外层包装元素。以下是修改后的代码示例:

type UserData struct {
	SomeData struct {
		AnotherData []struct {
			Data1  string  `xml:"pair1" json:"pair1"`
			Data2  string  `xml:"pair2" json:"pair2"`
			Data3  float64 `xml:"rate" json:"rate"`
			InnerData struct {
				InnerData1 float64 `xml:"inner1" json:"inner1"`
				InnerData2 float64 `xml:"inner2" json:"inner2"`
			} `xml:"innerdata" json:"innerdata"`
		} `xml:"anotherdata" json:"anotherdata"`
	} `xml:",innerxml" json:"somedata"`
}

编码时直接使用 SomeData 字段:

package main

import (
	"encoding/xml"
	"fmt"
)

func main() {
	data := UserData{
		SomeData: struct {
			AnotherData []struct {
				Data1  string  `xml:"pair1" json:"pair1"`
				Data2  string  `xml:"pair2" json:"pair2"`
				Data3  float64 `xml:"rate" json:"rate"`
				InnerData struct {
					InnerData1 float64 `xml:"inner1" json:"inner1"`
					InnerData2 float64 `xml:"inner2" json:"inner2"`
				} `xml:"innerdata" json:"innerdata"`
			} `xml:"anotherdata" json:"anotherdata"`
		}{
			AnotherData: []struct {
				Data1  string  `xml:"pair1" json:"pair1"`
				Data2  string  `xml:"pair2" json:"pair2"`
				Data3  float64 `xml:"rate" json:"rate"`
				InnerData struct {
					InnerData1 float64 `xml:"inner1" json:"inner1"`
					InnerData2 float64 `xml:"inner2" json:"inner2"`
				} `xml:"innerdata" json:"innerdata"`
			}{
				{
					Data1: "value1",
					Data2: "value2",
					Data3: 1.23,
					InnerData: struct {
						InnerData1 float64 `xml:"inner1" json:"inner1"`
						InnerData2 float64 `xml:"inner2" json:"inner2"`
					}{
						InnerData1: 4.56,
						InnerData2: 7.89,
					},
				},
			},
		},
	}

	output, err := xml.MarshalIndent(data.SomeData, "", "  ")
	if err != nil {
		panic(err)
	}
	
	fmt.Println(xml.Header + string(output))
}

输出结果将以 <someData> 直接开始:

<?xml version="1.0" encoding="UTF-8"?>
<someData>
  <anotherdata>
    <pair1>value1</pair1>
    <pair2>value2</pair2>
    <rate>1.23</rate>
    <innerdata>
      <inner1>4.56</inner1>
      <inner2>7.89</inner2>
    </innerdata>
  </anotherdata>
</someData>

如果需要完全省略 UserData 结构体,可以直接定义 SomeData 类型:

type SomeData struct {
	AnotherData []struct {
		Data1  string  `xml:"pair1" json:"pair1"`
		Data2  string  `xml:"pair2" json:"pair2"`
		Data3  float64 `xml:"rate" json:"rate"`
		InnerData struct {
			InnerData1 float64 `xml:"inner1" json:"inner1"`
			InnerData2 float64 `xml:"inner2" json:"inner2"`
		} `xml:"innerdata" json:"innerdata"`
	} `xml:"anotherdata" json:"anotherdata"`
}

然后直接编码 SomeData 实例。

回到顶部