2013-07-10 9 views
7

Considerare questi documenti 2 XMLEvitare intero XML analizzano se il campo vuoto

<a> 
    <b nil="true"></b> 
</a> 

e

<a> 
    <b type="integer">1</b> 
</a> 

Come posso unmarshalling questo XML correttamente Vai a un campo b struct di tipo int, senza producendo un errore strconv.ParseInt: parsing "": invalid syntax nel primo caso?

non sembra funzionare in questo caso.

Esempio: http://play.golang.org/p/fbhVJ4zUbl

+0

Si consiglia di eseguire la propria implementazione del decoder XML che include il decodificatore xml di Go. 'Encoding/json' è molto più potente, si potrebbe prendere come esempio. Se 'json.Unmarshal (...)' vede che l'istanza di tipi 'obj' implementa' json.Unmarshaler', chiamerà 'obj.UnmarshalJSON'. Non ho idea del perché 'encoding/xml' non faccia la stessa cosa. Puoi pubblicare la tua domanda sulla [Vai mailing list] (https://groups.google.com/forum/#!forum/golang-nuts). Sembra strano che rendere "b" un puntatore non funziona neanche. – Philip

risposta

1

Il tag omitempty è solo rispettata con il maresciallo, non Unmarshal.

Errori unmarshal se il valore int non è un int effettivo.

Invece, modificare B in una stringa. Quindi, converti B in un int con il pacchetto strconv. Se esso errori, impostarlo a 0.

Prova questo frammento: http://play.golang.org/p/1zqmlmIQDB

+0

L'analisi manuale non è ciò che sto cercando di fare qui. Questa è comunque l'opzione più ovvia se XML unmarshaller non può gestirlo. Detto questo, non inquinerò la struttura con i metadati solo per questo. –

0

È possibile usare il pacchetto "github.com/guregu/null". Aiuta:

package main 
import (
"fmt" 
    "encoding/xml" 
    "github.com/guregu/null" 
) 

type Items struct{ 
    It []Item `xml:"Item"` 
} 

type Item struct { 
    DealNo string 
    ItemNo null.Int 
    Name  string 
    Price null.Float 
    Quantity null.Float 
    Place string 
} 

func main(){ 
    data := ` 
    <Items> 
     <Item> 
       <DealNo/> 
       <ItemNo>32435</ItemNo> 
       <Name>dsffdf</Name> 
       <Price>135.12</Price> 
       <Quantity></Quantity> 
       <Place>dsffs</Place> 
      </Item> 
      <Item> 
       <DealNo/> 
       <ItemNo></ItemNo> 
       <Name>dsfsfs</Name> 
       <Price></Price> 
       <Quantity>1.5</Quantity> 
       <Place>sfsfsfs</Place> 
      </Item> 
      </Items>` 

var xmlMsg Items 

     if err := xml.Unmarshal([]byte(data), &xmlMsg); err != nil { 
     fmt.Println("Error: cannot unmarshal xml from web ", err) 
     } else { 
      fmt.Println("XML: ", xmlMsg) 
     } 
} 
Problemi correlati