2 回答

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超8個(gè)贊
您可以使用 encoding/xml 包中的原語(yǔ)動(dòng)態(tài)修改 XML 流。在這種情況下,實(shí)施xml.TokenReader是一個(gè)簡(jiǎn)單的解決方案:
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
表示文本節(jié)點(diǎn)。每當(dāng)遇到一個(gè)時(shí),bytes.TrimSpace
都會(huì)調(diào)用修剪前導(dǎo)和尾隨空格。所有其他標(biāo)記均原封不動(dòng)地返回。
xml.NewTokenDecoder
變Trimmer
回常規(guī)解碼器:
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貢獻(xiàn)1803條經(jīng)驗(yàn) 獲得超6個(gè)贊
根據(jù)數(shù)據(jù)的外觀,這很容易>
不起作用,但是如果數(shù)據(jù)是可預(yù)測(cè)的并且除了 XML 標(biāo)記之外不會(huì)包含任何地方,您可以這樣做:
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 關(guān)注
- 180 瀏覽
添加回答
舉報(bào)