为了账号安全,请及时绑定邮箱和手机立即绑定

所有 XML 文本的 TrimSpaces

所有 XML 文本的 TrimSpaces

Go
万千封印 2023-06-01 14:08:55
我正在从我无法控制的外部 Web 服务中检索 XML 字符串。一些数据包含空格<data>    I have leading white space</data>。如何修剪 XML 字符串中每个元素的空格?
查看完整描述

2 回答

?
www说

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


查看完整回答
反对 回复 2023-06-01
?
慕码人8056858

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)

}


查看完整回答
反对 回复 2023-06-01
  • 2 回答
  • 0 关注
  • 126 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信