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

如何在 Go xml 结构标记中表示替代项

如何在 Go xml 结构标记中表示替代项

Go
缥缈止盈 2021-12-20 19:22:28
我正在尝试编写适当的结构标记集来解析UCUM的XML 版本。以下是unit标签的两个示例:<unit Code="deg" CODE="DEG" isMetric="no" class="iso1000">   <name>degree</name>   <printSymbol>&#176;</printSymbol>   <property>plane angle</property>   <value Unit="[pi].rad/360" UNIT="[PI].RAD/360" value="2">2</value></unit><unit Code="[degF]" CODE="[DEGF]" isMetric="no" isSpecial="yes" class="heat">   <name>degree Fahrenheit</name>   <printSymbol>&#176;F</printSymbol>   <property>temperature</property>   <value Unit="degf(5 K/9)" UNIT="DEGF(5 K/9)">      <function name="degF" value="5" Unit="K/9"/>   </value></unit>棘手的部分是value标签的内容,它可以是字符串(我用字符串属性表示)或函数(需要自己的结构)。这是我到目前为止所得到的:type Unit struct {    Code             string `xml:Code,attr`    CodeCaps         string `xml:CODE,attr`    IsMetric         bool   `xml:isMetric,attr,omitempty`    IsSpecial        bool   `xml:isEmptySpecial,attr,omitempty`    Class            string `xml:class,attr`    Name             string `xml:name`    PrintSymbol      string `xml:printSymbol,chardata`    DimensionTypeKey string `xml:property,chardata`    Value            struct {        Unit       string `xml:Unit,attr`        UnitCaps   string `xml:UNIT,attr`        Value      string `xml:Value,attr`        PrintValue string `xml:,chardata`        Function   struct { ... }    } `xml:value`}如何使用结构标记准确描述此 XML?
查看完整描述

1 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

你的代码几乎可以工作了;这是固定版本。


基本上你需要进行以下调整:


在 struct 标签中,值(xml:前缀后的位)必须用双引号括起来,如下所示:


`xml:"foo,attr"`

,chardata当您只想获取元素标签之间的任何内容时,无需指定该位。


要提取<function>元素,只需为 is 提供一个数据类型:如果它存在或不存在,解析器将提取它。


要判断是否有<function>,您可以检查该PrintValue字段的值:如果不是全空白,则没有<function>元素;否则有。


或者,定义一个单独的struct数据类型来解组这个元素,并将它的字段定义为指向该类型的指针,如


type Function struct { ... }

...

Function *Function `xml:"function"`

这样,如果没有<function>元素,则该字段的值将为nil,否则它将指向堆分配的Function实例。


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

添加回答

举报

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