2013-04-17 59 views
6

的XML格式,我需要解組如下:golang XML不是解組-ING正確

data := ` 
<table> 
    <name> 
     <code>23764</code> 
     <name>Smith, Jane</name> 
    </name> 
    <name> 
     <code>11111</code> 
     <name>Doe, John</name> 
    </name> 
</table> 
` 

我已經嘗試了以下結構和代碼無濟於事:

type Customers struct { 

    XMLName xml.Name `xml:"table"` 
    Custs []Customer 
} 

type Customer struct { 

    XMLName xml.Name `xml:"name"` 
    Code string `xml:"code"` 
    Name string `xml:"name"` 
} 

... 

var custs Customers 
err := xml.Unmarshal([]byte(data), &custs) 
if err != nil { 
    fmt.Printf("error: %v", err) 
    return 
} 

fmt.Printf("%v", custs) 

for _, cust := range custs.Custs { 

    fmt.Printf("Cust:\n%v\n", cust) 
} 

範圍版畫什麼都沒有,並且印刷custs只給我{{ table} []}

回答

16

正確的結構如下:

type Customer struct { 
    Code string `xml:"code"` 
    Name string `xml:"name"` 
} 

type Customers struct { 
    Customers []Customer `xml:"name"` 
} 

您可以試試on the playground here。 問題是您沒有爲[]Customer分配xml標記。

你解決這個問題的方式,使用xml.Name也是正確的,但更詳細。 您可以查看工作代碼here。 如果因爲某些原因需要使用xml.Name字段,我會建議使用專用字段 ,以便導出的版本不會混亂。

+0

輝煌 - 這確實有效。出於某種原因,我認爲我不得不使用XMLName來表示該字段的標題,如果它不匹配。 – Darrrrrren

+1

使用'xml.Name'的目的是在運行時覆蓋父標籤,因爲它的值也被認爲是好的。因此,您可以將'xml.Name'的值用於'table'結構,並將Customers結構重新用於具有不同父級標記名稱的類似外觀XML結構。 – nemo