使用可变子类型解组XML

时间:2018-02-14 20:14:15

标签: xml go unmarshalling

我的XML看起来像这样:

fnmatch.filter

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?> <smses count="500"> <sms id="1" text="hi" sms_specific_field="blah" /> <sms id="2" text="what's up?" sms_specific_field="blah" /> <mms id="3" text="null" text_only="0"> <parts> <part seq="-1" content="image/jpeg" text="null" data="base64_data_here==" /> <part seq="0" content="text/plain" text="Check it out!" /> </parts> </mms> <sms id="4" text="what's up?" sms_specific_field="blah" /> </smses> 的{​​{1}}和sms子项可以按任何顺序出现。我想将这些数据解组为本机Go结构。我以为我可以使用一些接口来实现:

mms

但是,我如何将其转换为每种类型的编组结构?

我正在考虑接近它,但不确定这是否能够涵盖两者并且不想花费所有时间来编写这个结构,如果这整个方法赢得了更多的属性无论如何都要工作:

smses

如何设计我的结构以解组此XML,包括属性和子项?

1 个答案:

答案 0 :(得分:1)

一种可能的方法是这样的:

type Messages struct {
    XMLName xml.Name `xml:"smses"`
    Count   string   `xml:"count,attr"`
    MMS     []MMS    `xml:"mms"`
    SMS     []SMS    `xml:"sms"`
}

这会将所有子mms元素解放为MMS,将所有子sms元素解组为SMS。然后,您可以根据需要迭代这些以进行进一步处理,例如将它们嵌入到Message个对象中并将它们放入组合切片中。但是,这将失去原始的XML源顺序。