golang:在xml.Marshal中省略struct的名称

时间:2017-03-29 18:00:58

标签: xml go

尝试获取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

}

1 个答案:

答案 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