2015-11-06 70 views
1

我有以下的代碼片段,我一直在試圖讓它工作的牆上撞我的頭。我到處尋找解決辦法,但沒有發現我找到的那些方法。unmarshal與轉到嵌套xml

看起來我的映射是xml.Unmarshal命令的問題,因爲它與嵌套字段有關。下面的代碼用於檢索名爲unit的第一個值,並且位於xml代碼的頂層。

其他兩個字段爲零,它們嵌套在兩個深度。這意味着結構設置不正確。這是代碼。

package main 

import (
    "encoding/xml" 
    "fmt" 
) 

type datevalue struct { 
    Date int  `xml:"date"` 
    Value float32 `xml:"value"` 
} 

type pv struct { 
    XMLName xml.Name `xml:"series"` 
    Unit  string `xml:"unit"` 
    datevalues datevalue `xml:"values>dateValue"` 
} 

func main() { 
    contents := `<series> 
        <timeUnit>DAY</timeUnit> 
        <unit>Wh</unit><measuredBy>INVERTER</measuredBy> 
        <values><dateValue> 
         <date>2015-11-04 00:00:00</date> 
         <value>5935.405</value> 
        </dateValue></values> 
       </series>` 

    m := &pv{} 
    xml.Unmarshal([]byte(contents), &m) 
    fmt.Printf("%s %f %d\n", m.Unit, m.datevalues.Value, m.datevalues.Date) 
} 

這裏是輸出:

Wh 0.000000 0 
+2

我沒有看到一個問題在這裏.... – Brick

+0

你解組忽略錯誤,你試圖將一個日期解組到一個int中,並且'datevalues'字段不會被導出,所以它不會被xml包所看到。 – JimB

回答

5

的所有代碼不工作,因爲你應該使用編組/解組出口領域(見https://golang.org/pkg/encoding/xml/)首先
你應該DateValues字段名稱使用的

type pv struct { 
    XMLName xml.Name `xml:"series"` 
    Unit  string `xml:"unit"` 
    Datevalues datevalue `xml:"values>dateValue"` 
} 

代替

type pv struct { 
    XMLName xml.Name `xml:"series"` 
    Unit  string `xml:"unit"` 
    datevalues datevalue `xml:"values>dateValue"` 
} 

看。如果第一個符號是大寫的,它將被導出。

它,我注意到,您忽略你的錯誤後:否則該字段將同時Unmarshal

二被忽略。請不要忽視它們,它們非常有用。

檢查出來的go playgroung

正如你可以看到你使用int數據類型的datatypeDate領域。 如果您將類型更改爲string,那麼您的代碼將起作用。

三:

我覺得你真的要來解讀你的date價值爲time.Time
要做到這一點,你可以檢查this related question

完整的工作代碼,你可以嘗試在go playground

+0

感謝您的回覆。我沒有意識到結構中的字段必須導出才能工作。 –