所有XML文本的TrimSpaces

时间:2019-01-08 17:30:47

标签: xml go

我正在从我无法控制的外部Web服务中检索XML字符串。某些数据包含空白<data> I have leading white space</data>。如何修剪XML字符串中每个元素的空间?

2 个答案:

答案 0 :(得分:4)

您可以使用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
}

Trimmer包装基础解码器并返回修改的令牌流。 xml.CharData代表文本节点。每当遇到一个空白时,都会调用bytes.TrimSpace来修剪前导和尾随空白。其他所有令牌均未经修改返回。

xml.NewTokenDecoderTrimmer重新变成常规解码器:

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)

答案 1 :(得分:0)

这可能容易不起作用,具体取决于数据的外观,但是如果数据是可预测的,并且除了XML标签之外不包含>,您可以执行以下操作:< / p>

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)
}