2
我试图创建一个实现MarshalXML输出的XML。 但目前我正面临几个问题。Golang XML自定义输出
我使用的用于存储数据的结构是:
type Edition struct {
Launch string `xml:"launch" json:"launch"`
Code string `xml:"code" json:"code"`
Names []NameNode `xml:"names>name"`
Cards CardsComposition `xml:"cards" json:"cards,omitempty"`
Preconstructed PreconstructedInfo `xml:"preconstructed" json:"preconstructed,omitempty"`
Vault *struct{} `xml:"vault" json:"vault"`
Online *struct{} `xml:"online" json:"online"`
}
我要的是: 如果未设置预先构建的领域,不要把<preconstructed>
标签(使用标准的封送它即使它是空的)。
所以我所做的是:
func (preconstructed PreconstructedInfo) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
if (PreconstructedInfo{} == preconstructed) {
return nil
}
return e.EncodeElement(preconstructed, start)
}
而且它显然作品,如果我用它的编码单版实体。 但是,如果我尝试编码版实体的数组,我得到以下错误:
runtime: goroutine stack exceeds 1000000000-byte limit
fatal error: stack overflow
(数组是〜200个)
所以我不明白的是:
- 为什么堆栈溢出问题只发生在我尝试自定义xml时出现,在这种情况下,它也试图删除空标签,所以“节省空间”
- 这样做的最佳方式是什么?有人可以向我解释如何实现一个定制的XML Marshaller去?我发现很多JSON元帅,但几乎没有任何XML)
根据你的堆栈溢出,你导致了一个无限循环,所以EncodeElement调用了正在调用EncodeElement的MarshalXML。 – GarMan
好的,但是为什么只有尝试编组一个版本元素才会发生这种情况,而不是如果我编组单个元素? – Ivan