2013-04-17 13 views
6

XML形式は次のとおりです。golangのXMLは、私が非整列化する必要が適切に

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'を使う目的は、実行時に親タグを値を無視して無視することです。したがって、 'table'構造体に' xml.Name'の値を使用し、親構造体タグ名が異なる類似したXML構造体に対してCustomers構造体を再利用することができます。 – nemo

関連する問題