3

XMLタグ名が動的である状況に遭遇するまで、私は問題なくunmarshalを使用してきました。

XMLは次のようになります。

<unit_amount_in_cents>
 <USD type="integer">4000</USD>
</unit_amount_in_cents>
<setup_fee_in_cents>
 <USD type="integer">4000</USD>
</setup_fee_in_cents>

また

 <unit_amount_in_cents>
  <GBP type="integer">4000</GBP>
 </unit_amount_in_cents>
 <setup_fee_in_cents>
  <GBP type="integer">4000</GBP>
 </setup_fee_in_cents>

または両方(またはそれ以上)を持つことができます

<unit_amount_in_cents>
 <USD type="integer">4000</USD>
 <GBP type="integer">4000</GBP>
</unit_amount_in_cents>
<setup_fee_in_cents>
 <USD type="integer">4000</USD>
 <GBP type="integer">4000</USD>
</setup_fee_in_cents>

XML.Name.Localを必要なものに割り当てることで、問題なくxmlにマーシャリングできますが、マーシャリングを解除することはできません。

構造体は次のようになります

type Plan struct {
    XMLName xml.Name `xml:"plan"`
    Name string `xml:"name,omitempty"`
    PlanCode string `xml:"plan_code,omitempty"`
    Description string `xml:"description,omitempty"`
    SuccessUrl string `xml:"success_url,omitempty"`
    CancelUrl string `xml:"cancel_url,omitempty"`
    DisplayDonationAmounts bool `xml:"display_donation_amounts,omitempty"`
    DisplayQuantity bool `xml:"display_quantity,omitempty"`
    DisplayPhoneNumber bool `xml:"display_phone_number,omitempty"`
    BypassHostedConfirmation bool `xml:"bypass_hosted_confirmation,omitempty"`
    UnitName string `xml:"unit_name,omitempty"`
    PaymentPageTOSLink string `xml:"payment_page_tos_link,omitempty"`
    PlanIntervalLength int `xml:"plan_interval_length,omitempty"`
    PlanIntervalUnit string `xml:"plan_interval_unit,omitempty"`
    AccountingCode string `xml:"accounting_code,omitempty"`
    CreatedAt *time.Time `xml:"created_at,omitempty"`
    SetupFeeInCents CurrencyArray `xml:"setup_fee_in_cents,omitempty"`
    UnitAmountInCents CurrencyArray `xml:"unit_amount_in_cents,omitempty"`
}

type CurrencyArray struct {
    CurrencyList []Currency
}

func (c *CurrencyArray) AddCurrency(currency string, amount int) {
    newc := Currency{Amount:fmt.Sprintf("%v",amount)}
    newc.XMLName.Local = currency
    c.CurrencyList = append(c.CurrencyList, newc)
}

func (c *CurrencyArray) GetCurrencyValue(currency string) (value int, e error) {
    for _, v := range c.CurrencyList {
            if v.XMLName.Local == currency {
                    value, e = strconv.Atoi(v.Amount)
                    return
            } 
    }
    e = errors.New(fmt.Sprintf("%s not found",currency))
    return
}       

type Currency struct {
    XMLName xml.Name `xml:""`
    Amount string `xml:",chardata"`
}
4

1 に答える 1

6

フィールドにタグxml:",any"が必要です。CurrencyList

http://play.golang.org/p/i23w03z6R4

于 2012-06-07T00:50:27.643 に答える