You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言XML反序列化问询:如何处理给定的XML结构

在Go语言中实现XML反序列化的方案

没问题!在Go里处理XML反序列化其实很直接,关键是要把你的XML结构精准映射到对应的Go结构体上。我给你一步步拆解具体操作:

步骤1:定义匹配XML结构的Go结构体

首先,我们需要根据你的XML层级和属性,定义对应的结构体,并通过xml标签建立字段与XML元素/属性的关联:

package main

import (
	"encoding/xml"
	"fmt"
	"log"
)

// Root 对应最外层的<a>根元素
type Root struct {
	XMLName xml.Name `xml:"a"`
	Client  Client   `xml:"client"` // 匹配<a>下的<client>子元素
	Card    Card     `xml:"card"`   // 匹配<a>下的<card>子元素
}

// Client 对应<client>元素及其所有属性
type Client struct {
	ClientID        string `xml:"client_id,attr"`
	CltCode         string `xml:"clt_code,attr"`
	CltDate         string `xml:"clt_date,attr"`
	SMSBlock        string `xml:"sms_block,attr"`
	ActiveServ      string `xml:"active_serv,attr"`
	Phone           string `xml:"phone,attr"`
	ThresholdAmount string `xml:"threshold_amount,attr"`
	CltCharge       string `xml:"clt_charge,attr"`
	CltChargeID     string `xml:"clt_charge_id,attr"`
}

// Card 对应<card>元素,内部包含多个<a>子元素
type Card struct {
	Cards []CardItem `xml:"a"` // 用切片接收所有<card>下的<a>元素
}

// CardItem 对应<card>下的单个<a>元素及其属性
type CardItem struct {
	CardNum string `xml:"card_num,attr"`
	CardID  string `xml:"card_id,attr"`
	CrdCode string `xml:"crd_code,attr"`
	CrdDate string `xml:"crd_date,attr"`
}

步骤2:执行反序列化操作

接下来,使用encoding/xml包的Unmarshal函数将XML数据解析到我们定义的结构体中:

func main() {
	// 注意:你的原始XML最后一个<a>标签未闭合,这里我补全了格式
	xmlContent := `
<a> 
  <client client_id="6881937" clt_code="0" clt_date="" sms_block="N" active_serv="N" phone="77777645521" threshold_amount="1" clt_charge="" clt_charge_id="" /> 
  <card> 
    <a card_num="KZ5392...6449" card_id="66783573" crd_code="0" crd_date="" /> 
    <a card_num="552204...9124" card_id="66783574" crd_code="0" crd_date="" /> 
    <a card_num="KZ7392...4128" card_id="14335135" crd_code="0" crd_date="" /> 
    <a card_num="440564...7683" card_id="12345678" crd_code="0" crd_date="" /> 
  </card> 
</a>
`

	var root Root
	err := xml.Unmarshal([]byte(xmlContent), &root)
	if err != nil {
		log.Fatalf("XML反序列化失败: %v", err)
	}

	// 打印解析结果验证
	fmt.Println("解析后的客户端信息:")
	fmt.Printf("Client ID: %s\n", root.Client.ClientID)
	fmt.Printf("手机号: %s\n", root.Client.Phone)
	fmt.Printf("短信拦截状态: %s\n", root.Client.SMSBlock)

	fmt.Println("\n解析后的卡片列表:")
	for idx, card := range root.Card.Cards {
		fmt.Printf("第%d张卡片:\n", idx+1)
		fmt.Printf("  卡号: %s\n", card.CardNum)
		fmt.Printf("  卡片ID: %s\n", card.CardID)
	}
}

关键注意事项

内容的提问来源于stack exchange,提问作者Юрий Шиповалов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:21:21