From e37ddb00df8d32095c8ec4744b9b873fae34cac6 Mon Sep 17 00:00:00 2001 From: Vasiliy Tolstov Date: Tue, 13 May 2025 19:51:26 +0300 Subject: [PATCH] add options Signed-off-by: Vasiliy Tolstov --- xml.go | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/xml.go b/xml.go index 704293d..868833c 100644 --- a/xml.go +++ b/xml.go @@ -21,6 +21,18 @@ const ( flattenTag = "flatten" ) +type unmarshalStrictKey struct{} + +func UnmarshalStrict(b bool) codec.Option { + return codec.SetOption(unmarshalStrictKey{}, b) +} + +type unmarshalXML11Key struct{} + +func UnmarshalXML11(b bool) codec.Option { + return codec.SetOption(unmarshalXML11Key{}, b) +} + func (c *xmlCodec) Marshal(v interface{}, opts ...codec.Option) ([]byte, error) { if v == nil { return nil, nil @@ -82,7 +94,32 @@ func (c *xmlCodec) Unmarshal(b []byte, v interface{}, opts ...codec.Option) erro return nil } - return xml.NewDecoder(newReader(b)).Decode(v) + var unmarshalStrict bool + var unmarshalXML11 bool + if options.Context != nil { + if v, ok := options.Context.Value(unmarshalStrictKey{}).(bool); ok { + unmarshalStrict = v + } + if v, ok := options.Context.Value(unmarshalXML11Key{}).(bool); ok { + unmarshalXML11 = v + } + } + + var r io.Reader + + if unmarshalXML11 { + r = newReader(b) + } else { + r = bytes.NewReader(b) + } + + d := xml.NewDecoder(r) + + if unmarshalStrict { + d.Strict = true + } + + return d.Decode(v) } type reader struct {