2013-07-10 23 views
7

Rozważmy te dokumenty 2 XMLUnikać XML całkowitą analizy: jeśli pole puste

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

i

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

Jak mogę unmarshal ten XML prawidłowo Przejdź do pola b struct typu int, bez produkuje błąd strconv.ParseInt: parsing "": invalid syntax w pierwszym przypadku?

nie wydaje się działać w tym przypadku.

przykład: http://play.golang.org/p/fbhVJ4zUbl

+0

Możesz chcieć stworzyć własną implementację dekodera XML owijając dekoder Go. "Kodowanie/json" jest o wiele potężniejsze, możesz wziąć to jako przykład. Jeśli 'json.Unmarshal (...)' zauważy, że twoja instancja typów 'obj' implementuje' json.Unmarshaler', wywoła ona 'obj.UnmarshalJSON'. Nie mam pojęcia, dlaczego "encoding/xml" nie robi tego samego. Możesz odesłać swoje pytanie na listę [Go mailing list] (https://groups.google.com/forum/#!forum/golang-nuts). Wydaje się dziwne, że robienie "b" wskaźnikiem również nie działa. – Philip

Odpowiedz

1

Znacznik omitempty właśnie przestrzegane z Marszałek nie unmarshal.

Unmarshal błędy, jeśli int nie jest rzeczywistą int.

Zamiast tego zmień B na ciąg. Następnie przekonwertuj B na int z pakietem strconv. Jeśli go błędy, ustaw ją na 0.

Spróbuj tego fragmentu: http://play.golang.org/p/1zqmlmIQDB

+0

Ręczne parsowanie nie jest tym, co próbuję tutaj zrobić. Jest to oczywiście i tak oczywiste, jeśli XML unmarshaller nie może sobie z tym poradzić. Powiedział, że nie będę zanieczyszczał struktury za pomocą pól meta tylko po to. –

0

Można użyć pakietu „github.com/guregu/null”. Pomaga:

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) 
     } 
} 
Powiązane problemy