Это касается атрибута xsi: type , но если у вас есть элемент с именем <<strong> soap: envelope ...>, возникают аналогичные проблемы, когда кажется необходимым реализовать пользовательский unmarshalerфункции.
вот код с проблемой (на игровой площадке: https://play.golang.org/p/ORQsINYS-9o)
type PayloadPublication struct {
XMLName xml.Name `json:"xmlName"`
XsiType xml.Attr `xml:"xsi type,attr" json:"xsiType"`
Lang xml.Attr `xml:"lang,attr" json:"lang"`
}
func main() {
payload := PayloadPublication{}
expectedXML := `<payloadPublication xmlns="http://datex2.eu/schema/2/2_0" xsi:type="MeasurementSiteTablePublication" lang="nl"></payloadPublication>`
// 1. Unmarshal - 2. Marshal - 3. Compare
err := xml.Unmarshal([]byte(expectedXML), &payload)
if err != nil {
fmt.Print(err.Error())
}
result, err := xml.Marshal(payload)
if err != nil {
fmt.Print(err.Error())
}
fmt.Printf("expected: %v\n", expectedXML)
fmt.Printf("result: %v\n", string(result))
}
результат
expected: <payloadPublication xmlns="http://datex2.eu/schema/2/2_0" xsi:type="MeasurementSiteTablePublication" lang="nl"></payloadPublication>
result: <payloadPublication xmlns="http://datex2.eu/schema/2/2_0" xmlns:xsi="xsi" xsi:type="MeasurementSiteTablePublication" lang="nl"></payloadPublication>
, как вы можете видеть атрибут xmlns: xsi = "xsi" был добавлен, что не то, что я хочу
В качестве обходного пути для этого можно было бы использовать пользовательский unmarshaler, но это кажется излишне сложным и многословным. (Код ниже). Есть ли более простой способ сделать это? Каким был бы обычный способ иметь дело с этим видом XML?
обходной код (на игровой площадке: https://play.golang.org/p/d4OtYPtYBDg)
type PayloadPublication struct {
XMLName xml.Name `json:"xmlName"`
XsiType xml.Attr `xml:"xsi type,attr" json:"xsiType"`
Lang xml.Attr `xml:"lang,attr" json:"lang"`
}
func (pp *PayloadPublication) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
// Attributes
for _, attr := range start.Attr {
if attr.Name.Local == "type" {
pp.XsiType = xml.Attr{Name: xml.Name{Local: "xsi:type"}, Value: attr.Value}
}
}
var dummy struct {
// attributes
XMLName xml.Name `json:"xmlName"`
XsiType xml.Attr `xml:"xsi type,attr" json:"xsiType"`
Lang xml.Attr `xml:"lang,attr" json:"lang"`
}
err := d.DecodeElement(&dummy, &start)
if err != nil {
return err
}
pp.XMLName = dummy.XMLName
pp.Lang = dummy.Lang
return nil
}
func main() {
payload := PayloadPublication{}
expectedXML := `<payloadPublication xmlns="http://datex2.eu/schema/2/2_0" xsi:type="MeasurementSiteTablePublication" lang="nl"></payloadPublication>`
// 1. Unmarshal - 2. Marshal - 3. Compare
err := xml.Unmarshal([]byte(expectedXML), &payload)
if err != nil {
fmt.Print(err.Error())
}
result, err := xml.Marshal(payload)
if err != nil {
fmt.Print(err.Error())
}
fmt.Printf("expected: %v\n", expectedXML)
fmt.Printf("result: %v\n", string(result))
}