为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Unmarshal 在 Go 中获取 XML 命名空间前缀

使用 Unmarshal 在 Go 中获取 XML 命名空间前缀

Go
元芳怎么了 2021-12-07 16:15:41
我想知道是否可以使用 .xml 中的Unmarshal方法获取 XML 命名空间前缀 encoding/xml。例如,我有:<application xmlns="http://wadl.dev.java.net/2009/02" xmlns:xs="  </application>我想知道如何检索xs定义 XMLSchema 的前缀,而不必使用该Token方法。
查看完整描述

2 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

像其他所有属性一样获取它:


type App struct {

    XS string `xml:"xs,attr"`

}

游乐场:http : //play.golang.org/p/2IOmkX1Jov。


如果你也有一个实际的xs属性 sans ,那就更棘手了xmlns。即使您将命名空间 URI 添加到XS的标记,您也可能会收到错误消息。


编辑:如果你想获得所有声明的命名空间,你可以UnmarshalXML在你的元素上定义一个自定义并扫描它的属性:


type App struct {

    Namespaces map[string]string

    Foo        int `xml:"foo"`

}


func (a *App) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {

    a.Namespaces = map[string]string{}

    for _, attr := range start.Attr {

        if attr.Name.Space == "xmlns" {

            a.Namespaces[attr.Name.Local] = attr.Value

        }

    }


    // Go on with unmarshalling.

    type app App

    aa := (*app)(a)

    return d.DecodeElement(aa, &start)

}

游乐场:http : //play.golang.org/p/u4RJBG3_jW。


查看完整回答
反对 回复 2021-12-07
?
皈依舞

TA贡献1851条经验 获得超3个赞

目前(Go 1.5),这似乎是不可能的。


我找到的唯一解决方案是使用倒带元素:


func NewDocument(r io.ReadSeeker) (*Document, error) {


    decoder := xml.NewDecoder(r)


    // Retrieve xml namespace first

    rootToken, err := decoder.Token()



    if err != nil {

        return nil, err

    }


    var xmlSchemaNamespace string


    switch element := rootToken.(type) {

    case xml.StartElement:


        for _, attr := range element.Attr {

            if attr.Value == xsd.XMLSchemaURI {

                xmlSchemaNamespace = attr.Name.Local

                break

            }

        }

    }


    /* Process name space */


    // Rewind

    r.Seek(0, 0)


    // Standart unmarshall

    decoder = xml.NewDecoder(r)

    err = decoder.Decode(&w)


    /* ... */

}


查看完整回答
反对 回复 2021-12-07
  • 2 回答
  • 0 关注
  • 254 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信