TrimSpaces для всего текста XML - PullRequest
0 голосов
/ 08 января 2019

Я получаю строку XML из внешнего веб-сервиса, который я не контролирую. Некоторые данные содержат пустые пробелы <data> I have leading white space</data>. Как обрезать пространство от каждого элемента в строке XML?

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Вы можете использовать примитивы в пакете 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)
0 голосов
/ 08 января 2019

Это может легко не работать в зависимости от того, как выглядят данные, но если данные предсказуемы и не будут содержать > где-либо, кроме тегов XML, вы можете сделать:

https://play.golang.org/p/4YSpvLFwHjZ

package main

import (
  "fmt"
  "regexp"
)

func main() {
  r := regexp.MustCompile(">(\\s*)")
  xml := "<test>   hello</test><test>  There</test><test>!</test>"
  xml = r.ReplaceAllString(xml, ">")
  fmt.Println(xml)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...