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 關注
- 169 瀏覽
添加回答
舉報