1 回答
TA贡献1836条经验 获得超3个赞
事实证明,目前没有办法在 Go 中原生地做到这一点。有一个与命名空间相关的问题列表,以及描述它的特定问题,但尚未解决。
但是,我也找到了一种解决方法。可以为属性和元素编写自己的解组代码。
对于属性,您可以实现以下内容:
type NonMarshalled string
func (s *NonMarshalled) UnmarshalXMLAttr(attr xml.Attr) error {
fmt.Printf("Parsing attribute '%s', with value '%s'", attr.Name.Local, attr.Value)
s.Title = strings.ToUpper(attr.Value)
return nil
}
type Typemap struct {
XMLName xml.Name `xml:"map"`
Name string `xml:"name,attr"`
Type NonNamespaced `xml:"type,attr"`
XsiType string `xml:"http://www.w3.org/2001/XMLSchema-instance type,attr"`
}
但是,这并不能同时具有命名空间属性名称和具有相同名称的非命名空间属性。这仍然会导致:
main.Typemap field "Type" with tag "type,attr" conflicts with field "XsiType" with tag "http://www.w3.org/2001/XMLSchema-instance type,attr"
这里的解决方法是为整个Typemap类型编写一个解组器。就我而言,此代码如下所示:
func (s *Typemap) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
nameAttr := ""
typeAttr := ""
xsiTypeAttr := ""
for _, attr := range start.Attr {
if attr.Name.Space == "" && attr.Name.Local == "name" {
nameAttr = attr.Value
}
if attr.Name.Space == "" && attr.Name.Local == "type" {
typeAttr = attr.Value
}
if attr.Name.Space == "http://www.w3.org/2001/XMLSchema-instance" && attr.Name.Local == "type" {
xsiTypeAttr = attr.Value
}
}
d.Skip()
*s = Typemap{Name: nameAttr, Type: typeAttr, XsiType: xsiTypeAttr}
return nil
}
- 1 回答
- 0 关注
- 215 浏览
添加回答
举报