2013-07-10 5 views
7

は、これら2つのXML文書避けXMLの整数フィールド空

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

私はせずに、タイプ intb構造体のフィールドに移動して適切にこのXMLを非整列化するにはどうすればよい
<a> 
    <b type="integer">1</b> 
</a> 

を検討する場合にエラーを解析最初のケースでエラーが発生しますか?

omitemptyこの場合は動作していないようです。

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

+0

GoのxmlデコーダをラップするXMLデコーダの独自の実装を行うことができます。 'encoding/json'ははるかに強力です。あなたはそれを例として取り上げることができます。 'json.Unmarshal(...)'が、あなたの型インスタンス 'obj'が' json.Unmarshaler'を実装していると判断すると、 'obj.UnmarshalJSON'を呼び出します。 'encoding/xml'がなぜ同じことをしないのか分かりません。 [Goメーリングリスト](https://groups.google.com/forum/#!forum/golang-nuts)に質問を再投稿してください。 'b'をポインタにすることもうまくいかないことは間違いです。 – Philip

答えて

1

omitemptyタグがちょうど非整列化し、元帥ではない尊敬されています。

int値が実際のintでない場合、非整列エラーが発生します。

代わりに、Bを文字列に変更します。次に、strconvパッケージでBをintに変換します。それエラーが、0

に設定している場合は、このスニペットを試してみてください:http://play.golang.org/p/1zqmlmIQDB

+0

これを手動で解析することは、私がここでやろうとしていることではありません。とにかく、XMLアンマーシャラーがそれを処理できない場合、それは明らかなオプションです。つまり、私は構造体をメタフィールドで汚染することはありません。 –

0

あなたは「github.com/guregu/null」パッケージを使用することができます。それは役立ちます:

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) 
     } 
} 
関連する問題