为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 中使用交替内容类型解组 XML 元素

在 Go 中使用交替内容类型解组 XML 元素

Go
摇曳的蔷薇 2023-08-07 19:01:59
我正在尝试像这样解组一段 xml:<message numerus="yes">    <source>%n part(s)</source>    <translation>        <numerusform>%n part</numerusform>        <numerusform>%n parts</numerusform>    </translation></message><message>    <source>Foo</source>    <translation>Bar</translation></message>请注意,<translation>标签可以包含一个简单的字符串或多个<numerusform>标签。使用 go 的 xml 包,我要解组的结构如下所示:type Message struct {    Source       string   `xml:"source"`    Numerus      string   `xml:"numerus,attr"`    Translation  string   `xml:"translation"`    NumerusForms []string `xml:"translation>numerusform"`}问题:要么字段Translation要么NumerusForms可以用。如果像此处所示同时使用两者,则会发生错误:Error on unmarshalling xml: main.Message field "Translation" with tag "translation" conflicts with field "NumerusForms" with tag "translation>numerusform"非常合理,因为解组器无法决定如何处理<translation>标签。有什么办法可以处理这个问题吗?可以有两个不同的命名字段(一个用于纯字符串,一个用于字符串列表,如上面所示的结构)。
查看完整描述

1 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

一种不需要实现自定义解组器逻辑的简单解决方案是创建一个Translation具有 2 个字段的结构:1 个用于可选文本内容,1 个用于可选<numerusform>子元素:


type Message struct {

    Source      string      `xml:"source"`

    Numerus     string      `xml:"numerus,attr"`

    Translation Translation `xml:"translation"`

}


type Translation struct {

    Content      string   `xml:",cdata"`

    NumerusForms []string `xml:"numerusform"`

}

这将输出(在Go Playground上尝试):


Source: %n part(s)

Numerus: yes

Translation: "\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t"

NumerusForms: [%n part %n parts]

  Numerus: %n part

  Numerus: %n parts


Source: Foo

Numerus: 

Translation: "Bar"

NumerusForms: []

请注意,当实际存在<numerusform>子元素时,该Translation.Content字段仍然会填充缩进字符,您可以安全地忽略这些字符。


查看完整回答
反对 回复 2023-08-07
  • 1 回答
  • 0 关注
  • 80 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信