2 回答
TA贡献1775条经验 获得超8个赞
您可以使用 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)
TA贡献1803条经验 获得超6个赞
根据数据的外观,这很容易>
不起作用,但是如果数据是可预测的并且除了 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)
}
- 2 回答
- 0 关注
- 126 浏览
添加回答
举报