44 lines
985 B
Go
44 lines
985 B
Go
|
package etreeutils
|
||
|
|
||
|
import (
|
||
|
"encoding/xml"
|
||
|
|
||
|
"github.com/beevik/etree"
|
||
|
)
|
||
|
|
||
|
// NSUnmarshalElement unmarshals the passed etree Element into the value pointed to by
|
||
|
// v using encoding/xml in the context of the passed NSContext. If v implements
|
||
|
// ElementKeeper, SetUnderlyingElement will be called on v with a reference to el.
|
||
|
func NSUnmarshalElement(ctx NSContext, el *etree.Element, v interface{}) error {
|
||
|
detatched, err := NSDetatch(ctx, el)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
doc := etree.NewDocument()
|
||
|
doc.AddChild(detatched)
|
||
|
data, err := doc.WriteToBytes()
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
err = xml.Unmarshal(data, v)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
switch v := v.(type) {
|
||
|
case ElementKeeper:
|
||
|
v.SetUnderlyingElement(el)
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// ElementKeeper should be implemented by types which will be passed to
|
||
|
// UnmarshalElement, but wish to keep a reference
|
||
|
type ElementKeeper interface {
|
||
|
SetUnderlyingElement(*etree.Element)
|
||
|
UnderlyingElement() *etree.Element
|
||
|
}
|