亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 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 關注
  • 153 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號