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

在 Go 中解组具有交替内容类型的 XML 元素

在 Go 中解组具有交替内容类型的 XML 元素

Go
largeQ 2022-04-20 20:52:58
我正在尝试像这样解组一段 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 回答

?
婷婷同学_

TA贡献1844条经验 获得超8个赞

一种不需要实现自定义解组器逻辑的简单解决方案是创建一个Translation具有 2 个字段的结构: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字段仍会填充缩进字符,您可以放心地忽略这些字符。


查看完整回答
反对 回复 2022-04-20
  • 1 回答
  • 0 关注
  • 106 浏览
慕课专栏
更多

添加回答

举报

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