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