xml - 解码具有可变子类型的 XML

标签 xml go unmarshalling

我有如下所示的 XML:

<?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>

smsessmsmms 子元素可以以任何顺序出现。我想将这些数据解码为 native Go 结构。我想我可以为这样的人使用一些接口(interface):

Messages []interface{} `xml:",any"`  // not sure if this is correct

但是我该如何将其放入每种类型的编码结构中呢?

我正在考虑像这样接近它,但不确定这是否适用于涵盖两者,并且不想花所有时间为将具有更多属性的结构编写这个,如果整个方法无论如何都不起作用:

type Messages struct {
    XMLName       xml.Name   `xml:"smses"`
    Count         string     `xml:"count,attr"`
    MessageList   []Message  `xml:",any"` // <-- will this work?
}

type Message struct {
    SMS           SMS        `xml:"sms"`
    MMS           MMS        `xml:"mms"`
    ID            string     `xml"id,attr"`
    Text          string     `xml:"text,attr"`
}

type SMS struct {
    XMLName       xml.Name   `xml:"sms"`
    SMSSpecField  string     `xml:"sms_specific_field,attr"`
}

type MMS struct {
    XMLName       xml.Name   `xml:"mms"`
    TextOnly      string     `xml:"text_only,attr"`
    Parts         []Part     `xml:"parts"`
}

... And so on - but I don't know if this approach works / makes sense

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

最佳答案

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

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 对象中并将它们放入组合 slice 中。但是,这将丢失原始 XML 源顺序。

关于xml - 解码具有可变子类型的 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48795458/

相关文章:

python - 如何将 Python ElemenTtree 编写为 XML 文件?

xml - 将封面插入 XSL :FO template

go - bufio.Writer写入后,bufio.Reader不会从文件中读取任何内容

json - 将 JSON 动态解码为仅包含基于类型字段的顶级字段的结构

go - Go 中的透明(类似过滤器)gzip/gunzip

c# - WCF 动态响应格式

java - 解析 XML 文件中特定标签的内容 (Java)

java - JAXB 和动态选择要实例化的类

java - 使用 xs :any and mixed content 维护 JAXB 中的空白

go - 在正确的结构中转换 json 而不是使用接口(interface)