2013-07-10 14 views
7

Betrachten Sie diese zwei XML-DokumenteVermeiden XML integer Parse-Fehler, wenn das Feld leer

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

und

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

Wie kann ich diese XML richtig in Gehen Sie zu einem b struct Feld vom Typ unmarshal int, ohne einen strconv.ParseInt: parsing "": invalid syntax Fehler im ersten Fall erzeugen?

omitempty scheint in diesem Fall nicht zu funktionieren.

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

+0

Sie können Ihre eigene Implementierung des XML-Decoders, der Go's XML-Decoder einpackt, machen. Das 'encoding/json' ist viel mächtiger, man könnte es als Beispiel nehmen. Wenn 'json.Unmarshal (...)' sieht, dass Ihre Typinstanz 'obj'' json.Unmarshaler' implementiert, wird es 'obj.UnmarshalJSON' aufgerufen. Ich habe keine Ahnung, warum das 'encoding/xml' nicht dasselbe tut. Möglicherweise möchten Sie Ihre Frage auf der [Go-Mailingliste] (https://groups.google.com/forum/#!forum/golang-nuts) erneut einreichen. Es scheint seltsam, dass es auch nicht funktioniert, wenn man "b" einen Zeiger macht. – Philip

Antwort

1

Die omitempty-Tag wird nur mit Marschall respektiert, nicht Abstellungs.

Unmarshal-Fehler, wenn der int-Wert kein tatsächlicher int-Wert ist.

Ändern Sie stattdessen B in eine Zeichenfolge. Dann wandle B mit dem strconv-Paket in int um. Wenn es Fehler, setzen Sie ihn auf 0

dieses Snippet Versuchen: http://play.golang.org/p/1zqmlmIQDB

+0

Manuelles Parsen ist nicht das, was ich hier versuche. Das ist sowieso die offensichtliche Option, wenn der XML-Unmarshaller damit nicht umgehen kann. Das heißt, ich werde die Struktur nicht nur dafür mit Meta-Feldern verunreinigen. –

0

Sie können "github.com/guregu/null" Paket. Es hilft:

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