2013-04-17 12 views
6

Format XML muszę unmarshal jest następujący:golang XML nie unmarshal-ing prawidłowo

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

próbowałem następujące konstrukcjom i kod bezskutecznie:

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

drukuje zakres nic, i drukowanie custs tylko daje mi {{ table} []}

Odpowiedz

16

prawidłowej struktury jest następująca:

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

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

Możesz go wypróbować on the playground here. Problem polega na tym, że nie przypisujesz znacznika xml dla []Customer.

Sposób, w jaki to rozwiązałeś, używając xml.Name jest również poprawny, ale bardziej szczegółowy. Możesz przejrzeć działający kod here. Jeśli chcesz użyć pola xml.Name z jakiegoś powodu, polecam używając prywatnego pola, aby wyeksportowana wersja struktury nie była zagracona.

+0

Genialny - to działa. Z jakiegoś powodu myślałem, że muszę użyć XMLName do oznaczenia tytułu pola, jeśli nie pasuje. – Darrrrrren

+1

Celem użycia 'xml.Name' jest nadpisanie tagu nadrzędnego w czasie wykonywania, ponieważ jego wartość również jest uznawana. Możesz więc użyć wartości 'xml.Name' dla struktury' table' i ponownie użyć struktury Customers w przypadku podobnej wyglądającej struktury XML z inną nazwą znacznika nadrzędnego. – nemo