如何在Go xml struct标记

时间:2016-03-15 15:23:03

标签: go xml-parsing

我正在尝试编写适当的struct标记集来解析XML version of UCUM。以下是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`
}

如何使用struct标签准确描述此XML?

1 个答案:

答案 0 :(得分:1)

您的代码几乎正常运行; here's the fixed version

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

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

    `xml:"foo,attr"`
    
  • 当您只想获得元素标签之间的任何内容时,无需指定,chardata位。

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

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

    或者,为解组此元素定义一个单独的struct数据类型,并将其字段定义为指向该类型的指针, 喜欢在

    type Function struct { ... }
    ...
    Function *Function `xml:"function"`
    

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