Вы можете использовать примитивы в пакете encoding / xml для изменения потока XML на лету. В этом случае реализация xml.TokenReader является простым решением:
import (
"bytes"
"encoding/xml"
)
type Trimmer struct {
dec *xml.Decoder
}
func (tr Trimmer) Token() (xml.Token, error) {
t, err := tr.dec.Token()
if cd, ok := t.(xml.CharData); ok {
t = xml.CharData(bytes.TrimSpace(cd))
}
return t, err
}
Триммер оборачивает базовый декодер и возвращает модифицированный поток токенов. xml.CharData
представляет текстовые узлы. Всякий раз, когда встречается один, bytes.TrimSpace
вызывается для обрезания начальных и конечных пробелов. Все остальные токены возвращаются без изменений.
xml.NewTokenDecoder
превращает Trimmer
обратно в обычный декодер:
import (
"encoding/xml"
"fmt"
"io"
"log"
)
var r io.Reader // data source
raw := xml.NewDecoder(r) // regular decoder
dec := xml.NewTokenDecoder(Trimmer{raw}) // trimming decoder
var v MyType
err := dec.Decode(&v)