当元素为空时,我如何使用xml包来换行结束标记

  • 本文关键字:xml 换行 结束 何使用 元素 xml go
  • 更新时间 :
  • 英文 :


我的目标是在元素为空时将结束标记打断为新行,并使用Go xml包。

此外,当元素为空时,无论嵌套深度如何,我都希望将结束标记缩进到与开始标记相同的深度。

go版本go1.15.2 darwin/amd64

想要

<aaa>
<bbb>
</bbb>
</aaa>

但是,如果内容为空,Go-xmlEncodeElement将生成不换行的结束标记。

https://play.golang.org/p/fa76aeZ9Xss

func main() {
var b bytes.Buffer
e := xml.NewEncoder(&b)
e.Indent("", "  ")

aaa := xml.StartElement{Name: xml.Name{Local: "aaa"}}
e.EncodeToken(aaa)

bbb := xml.StartElement{Name: xml.Name{Local: "bbb"}}
e.EncodeToken(bbb)
e.EncodeToken(bbb.End())

e.EncodeToken(aaa.End())
// execute
e.Flush()
fmt.Println(b.String())
}
<aaa>
<bbb></bbb>
</aaa>

我尝试在<bbb>处插入n。但是</bbb>没有缩进。

c := xml.CharData([]byte("n"))
e.EncodeToken(c)

https://play.golang.org/p/ekShCtPXBWR

<aaa>
<bbb>
</bbb>
</aaa>

此外,无论嵌套方式如何,我都希望结束标记缩进与开始标记相同的深度。

<xxx> 
<aaa>
<yyy>
<bbb>
</bbb>
</yyy>
</aaa>
</xxx>

有人知道解决办法吗?

根据收到的信息自行解决。

保存调用EncodeToken的次数,因为您需要知道要缩进多少空格。

aaa := xml.StartElement{Name: xml.Name{Local: "aaa"}}
e.EncodeToken(aaa)
cnt++
e.EncodeToken(aaa.End())

使用保存的计数插入缩进。

// insert new line, and indent
c := "n"
for i := 0; i < cnt; i++ {
c = c + "  "
}
e.EncodeToken(xml.CharData([]byte(c)))

https://play.golang.org/p/2-5qEHjT2B4

谢谢。

最新更新