2016-03-15 97 views
2

我正在嘗試編寫適當的結構標記集來解析XML version of UCUM。以下是unit標籤的兩個例子:如何在Go xml結構標記中表示替換項

<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

你的代碼幾乎可以工作; here's the fixed version

基本上你需要如下調整:

  • 在結構標記,值—位xml:前綴後—必須用雙引號,像這樣:

    `xml:"foo,attr"` 
    
  • 有如果您只想獲取元素標籤之間的任何內容,則無需指定,chardata位。

  • 提取<function>元素只是提供一個數據類型:解析器會提取它,如果它存在與否,如果它不存在。

    告訴是否有<function>與否,你可以檢查PrintValue字段的值:如果它是不是所有的空白,沒有<function>元素;否則有。

    可替換地,限定一個單獨的struct數據類型解編此元素,並具有字段爲它定義爲一個指針,它指向類型, 像

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

    這種方式,如果沒有<function>元件該字段的值將爲nil,否則它將指向一個堆分配的Function實例。