2013-07-10 5 views
7

इन 2 एक्सएमएल दस्तावेजोंबचें एक्सएमएल पूर्णांक पार्स त्रुटि है, तो मैदान खाली

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

और

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

मैं कैसे प्रकार int के b struct क्षेत्र पर जाएं में ठीक से इस एक्सएमएल unmarshal कर सकते हैं, बिना विचार करें पहले मामले में strconv.ParseInt: parsing "": invalid syntax त्रुटि का उत्पादन?

omitempty इस मामले में काम नहीं कर रहा है।

उदाहरण: http://play.golang.org/p/fbhVJ4zUbl

+0

आप एक्सएमएल डिकोडर रैपिंग गो के एक्सएमएल डिकोडर का अपना कार्यान्वयन करना चाह सकते हैं। 'एन्कोडिंग/जेसन' अधिक शक्तिशाली है, आप इसे उदाहरण के रूप में ले सकते हैं। यदि 'json.Unmarshal (...)' देखता है कि आपके प्रकार के उदाहरण 'obj'' json.Unmarshaler 'लागू करता है, तो यह' obj.UnmarshalJSON' को कॉल करेगा। मुझे नहीं पता कि 'एन्कोडिंग/एक्सएमएल' एक ही चीज़ क्यों नहीं करता है। आप [गो मेलिंग सूची] (https://groups.google.com/forum/#!forum/golang-nuts) पर अपने प्रश्न को दोबारा पोस्ट करना चाहते हैं। ऐसा लगता है कि 'बी' बनाने वाला पॉइंटर या तो काम नहीं करता है। – Philip

उत्तर

1

omitempty टैग बस unmarshal मार्शल के साथ सम्मान दिया जाता है, नहीं।

अनारशनल त्रुटियां यदि int मान वास्तविक int नहीं है।

इसके बजाय, बी को एक स्ट्रिंग में बदलें। फिर, strconv पैकेज के साथ बी को एक int में कनवर्ट करें। http://play.golang.org/p/1zqmlmIQDB

+0

मैन्युअल रूप से इसे पार्स करना वह नहीं है जो मैं यहां करने की कोशिश कर रहा हूं। यह स्पष्ट विकल्प है वैसे भी अगर एक्सएमएल unmarshaller इसे संभाल नहीं कर सकता है। उस ने कहा, मैं इस के लिए मेटा फ़ील्ड के साथ संरचना को प्रदूषित नहीं करूंगा। –

0

आप उपयोग कर सकते हैं "github.com/guregu/null" पैकेज: यह त्रुटियों, 0.

इस स्निपेट का प्रयास करने के लिए यह सेट करते हैं। यह मदद करता है:

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) 
     } 
} 
संबंधित मुद्दे