Многие soap сервисы используют пространство имен неквалифицированного атрибута / элемента форма
<schema id=ID attributeFormDefault=qualified|unqualified elementFormDefault=qualified|unqualified ...
The form for elements declared in the target namespace of this schema. The value must be "qualified" or "unqualified". Default is "unqualified". "unqualified" indicates that elements from the target namespace are not required to be qualified with the namespace prefix. "qualified" indicates that elements from the target namespace must be qualified with the namespace prefix
Мне нужно создать клиент для такой службы, поэтому я тестирую его
type Test struct {
XMLName xml.Name
XMLNs string `xml:"xmlns:c,attr"`
ID int
}
func main() {
var t1 Test
t1.XMLName.Local = "c:a"
t1.XMLNs = "sample"
d1, _ := xml.Marshal(&t1)
fmt.Println(string(d1))
}
И работает как надо . Но, когда я пытаюсь создать общий встроенный тип с XMLName
type Test2 struct {
XMLForm
ID int
}
type XMLForm struct {
XMLName xml.Name //`xml:"c:<name>"`
XMLNs string `xml:"xmlns:c,attr,omitempty"`
}
func (f *XMLForm) setXMLUnqualifiedName(name string) {
f.XMLName.Local = "c:" + name
f.XMLNs = "sample"
}
func main() {
var t2 Test2
t2.setXMLUnqualifiedName("a")
d2, _ := xml.Marshal(t2)
fmt.Println(string(d2))
}
Ошибка на go1.14.1 \ src \ encoding \ xml \ marshal. go:
482: } else if v, ok := xmlname.value(val).Interface().(Name); ok && v.Local != "" {
483: start.Name = v
484: }
(Невозможно привести к xml .Name). Это ошибка? Или отражать ограничения? Тем не менее, тег работает
Я не эксперт Go, и я запутался в порядке предпочтения:
- тег в поле XMLName, если данные представляют собой структуру
- значение поля XMLName типа Name
- тег поля структуры, используемого для получения данных
- имя поля структуры, используемого для получения данных
- имя маршалированного типа
Тег не может быть изменен во время выполнения. Почему тег предпочтительнее, чем значение?