Golang XML Unmarshalling - PullRequest
       1

Golang XML Unmarshalling

0 голосов
/ 25 апреля 2018
type Resp struct {
     Count string `xml:"totalRows"`
     Records []interface{} `xml:"data>record"`
}

type DepartmentRecord struct {
     DepID string `xml:"IDFIELD"`
}

type PersonRecord struct {
     UserID string `xml:"IDFIELD"`
}

Я ищу способ перехода в xml.Unmarshal Resp, структура которого изменена с желаемым типом записи.

1 Ответ

0 голосов
/ 26 апреля 2018

Во-первых, если вы хотите присвоить значениям срезов различных типов для поля, вы должны использовать interface{} вместо []interface{} в качестве типа поля, иначе вам придется преобразовать каждый элемент в срезе для интерфейсавручную.

type Resp struct {
     Count   string      `xml:"totalRows"`
     Records interface{} `xml:"data>record"`
}

Теперь, поскольку тип поля равен interface{}, xml-декодер сам по себе не знает, как разбирать данные xml, и поэтому поле остается нетронутым и незаполненным.Чтобы исправить это, вы можете помочь декодеру, предварительно выделив значение нужного вам типа и присвоив его полю.

resp := new(Resp)
resp.Records = new([]DepartmentRecord)
xml.Unmarshal(data, resp)

Или, если вы хотите избежать пост-утверждение типа unmarshal в поле Records, выделите переменную, назначьте это поле, и после unmarshal используйте переменную.

resp := new(Resp)
records := new([]DepartmentRecord)
resp.Records = records
xml.Unmarshal(data, resp)
// records is now populated and ready for use

Обратите внимание, что я намеренно использую new для типа срезав отличие от обычного make, это потому, что new возвращает выделенный указатель на нулевое значение переданного типа, и, я полагаю, xml-декодеру нужен базовый тип полей interface{}, чтобы быть типами указателя какв отличие от типов значений, которые make будет возвращать.Поэтому, прежде чем использовать срез записи, вам нужно разыменовать его, так как он фактически является указателем.

recs := *records

Полагаю, что более приятная версия приведенного выше будет выглядеть примерно так:

resp := new(Resp)
records := make([]DepartmentRecord, 0)
resp.Records = &records
xml.Unmarshal(data, resp)
// records is now populated and ready for use

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...