尝试获取XML的特定输出:
<RESPONSE>
<DELIMITER value="09"></DELIMITER>
<COLUMNS>Id FirstName LastName Company Initials</COLUMNS>
<DATA>87734 Some Guy Keller Williams Realty Empire </DATA>
<DATA>87739 Another Guy Level Group, Inc. </DATA>
<DATA>87741 Some Gal Kian Realty NYC, LLC </DATA>
</RESPONSE>
相反,我得到了:
<RESPONSE>
<compactData>
<DELIMITER value="09"></DELIMITER>
<COLUMNS>Id FirstName LastName Company Initials</COLUMNS>
<DATA>87734 Some Guy Keller Williams Realty Empire </DATA>
<DATA>87739 Another Guy Level Group, Inc. </DATA>
<DATA>87741 Some Gal Kian Realty NYC, LLC </DATA>
</compactData>
</RESPONSE>
我试图不输出&lt; compactData&gt;标签。 (其他一切都很好)
我编组的结构看起来像这样:
type delimiter struct {
Value string `xml:"value,attr"`
}
type innerData struct {
Data string `xml:",innerxml"`
}
type compactData struct {
Delimiter delimiter `xml:"DELIMITER"`
Columns *innerData `xml:"COLUMNS"`
Records []*innerData `xml:"DATA"`
}
我试过放入
XMLName xml.Name
或
XMLName xml.Name `xml:""`
无济于事 - xml.MarshalIndent只是说&#39;是的,看起来像废话取代结构名称&#39;。
我觉得好像我可能需要稍微重组一下这个结构,但我对所需的魔法结构感到难过。
谢谢!
编辑:&lt; RESPONSE&gt;在发送http.reponse时添加tag,在完成此格式化后,尝试使此签名与JSON和XML编码保持一致...
像这样:func createResponse(obj interface{}, format string) (*Response, error) {
var data []byte
var f func(interface{}, string, string) ([]byte, error)
switch format {
case FORMAT_JSON:
f = json.MarshalIndent
case FORMAT_COMPACT:
f = compact.MarshalIndent
default:
f = xml.MarshalIndent
}
data, err := f(obj, " ", " ")
if err != nil {
log.Println(err)
return nil, err
}
return &Response{Data: string(data)}, nil
}
答案 0 :(得分:3)
如果RESPONSE
是另一个struct
,您可以在其中嵌入compactData
,让encoding/xml
做您想做的事。
type RESPONSE struct {
compactData
}
https://play.golang.org/p/hN1hDY7pnV
<强>更新强>:
实际上,如果我理解正确,你可以通过实现xml.Marshaler
界面来做你想做的事。例如。像这样:https://play.golang.org/p/Uwm0pP1pWh。