2013-04-17 6 views
6

Das XML-Format I entpacken müssen, ist wie folgt:golang XML nicht Abstellungs-ing richtig

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

Ich habe die folgenden Strukturen und Code ohne Erfolg versucht:

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) 
} 

Die Palette Drucke nichts aus, und das Drucken custs gibt mir nur {{ table} []}

Antwort

16

die richtige Struktur ist die folgende:

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

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

Sie können es versuchen on the playground here. Das Problem ist, dass Sie das XML-Tag für []Customer nicht zuweisen.

Die Art und Weise, wie Sie dies gelöst haben, mit xml.Name ist auch korrekt, aber ausführlicher. Sie können den Arbeitscode here überprüfen. Wenn Sie aus irgendeinem Grund das Feld xml.Name verwenden müssen, würde ich empfehlen mit einem privaten Feld, so dass eine exportierte Version der Struktur nicht überladen ist.

+0

Brilliant - das funktioniert. Aus irgendeinem Grund dachte ich, ich müsste XMLName verwenden, um den Titel des Felds anzugeben, wenn es nicht übereinstimmte. – Darrrrrren

+1

Der Zweck für die Verwendung von 'xml.Name' besteht darin, das übergeordnete Tag zur Laufzeit zu überschreiben, da sein Wert ebenfalls berücksichtigt wird. Sie können also den Wert von 'xml.Name' für die' table'-Struktur verwenden und die Customers-Struktur für eine ähnlich aussehende XML-Struktur mit einem anderen übergeordneten Tag-Namen erneut verwenden. – nemo

Verwandte Themen