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

Go使用encoding/xml定义XML命名空间,编码结果不符合预期

Go语言encoding/xml包命名空间属性错误修复方案

问题根源:你给xmlns:xsd和xmlns:xsi这两个属性错误指定了目标命名空间(http://url),导致编码时把它们当成了该命名空间下的属性,从而生成了url:xmlns:xsd这类错误格式。

正确结构体定义

把xmlns:xsd和xmlns:xsi的标签改成无命名空间的形式,因为这类声明命名空间的属性本身属于全局命名空间,不需要绑定到业务命名空间:

import "encoding/xml"
import "time"

type MensagemEnvioANS struct {
    XMLName xml.Name `xml:"http://url mensagemEnvioANS"`
    // 去掉属性标签里的命名空间前缀,直接声明xmlns属性
    Xsd     string               `xml:"xmlns:xsd,attr"` 
    Xsi     string               `xml:"xmlns:xsi,attr"`
    Cabecalho *CabecalhoTransacao `xml:"cabecalhoTransacao"`
}

// 配套子结构体示例(根据你的代码补充)
type CabecalhoTransacao struct {
    RegistroANS string `xml:"registroANS"`
    VersaoPadrao string `xml:"versaoPadrao"`
    IdentificacaoTransacao *IdentificacaoTransacao `xml:"identificacaoTransacao"`
}

type IdentificacaoTransacao struct {
    TipoTransacao         string    `xml:"tipoTransacao"`
    NumeroLote            string    `xml:"numeroLote"`
    CompetenciaLote       string    `xml:"competenciaLote"`
    DataRegistroTransacao string    `xml:"dataRegistroTransacao"`
    HoraRegistroTransacao time.Time `xml:"horaRegistroTransacao"`
}

初始化代码(保持原有逻辑即可)

XML := MensagemEnvioANS{
    Xsd: "http://www.w3.org/2001/XMLSchema", // xsd标准命名空间URL
    Xsi: "http://www.w3.org/2001/XMLSchema-instance", // xsi标准命名空间URL
    Cabecalho: &CabecalhoTransacao{
        RegistroANS:  "RegistroANS",
        VersaoPadrao: "VersaoPadrao",
        IdentificacaoTransacao: &IdentificacaoTransacao{
            TipoTransacao:         "TipoTransacao",
            NumeroLote:            "NumeroLote",
            CompetenciaLote:       "CompetenciaLote",
            DataRegistroTransacao: "DataRegistroTransacao",
            HoraRegistroTransacao: time.Now(),
        },
    },
}

编码后正确XML片段

<mensagemEnvioANS xmlns="http://url" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <cabecalhoTransacao>
    <registroANS>RegistroANS</registroANS>
    <versaoPadrao>VersaoPadrao</versaoPadrao>
    <identificacaoTransacao>
      <tipoTransacao>TipoTransacao</tipoTransacao>
      <numeroLote>NumeroLote</numeroLote>
      <competenciaLote>CompetenciaLote</competenciaLote>
      <dataRegistroTransacao>DataRegistroTransacao</dataRegistroTransacao>
      <horaRegistroTransacao>2024-05-20T14:30:00Z</horaRegistroTransacao>
    </identificacaoTransacao>
  </cabecalhoTransacao>
</mensagemEnvioANS>

核心原理

xmlns:*是XML的命名空间声明属性,这类属性本身不属于任何业务命名空间,因此在Go的结构体标签中不需要为它们指定命名空间前缀,直接写xml:"xmlns:xsd,attr"即可让encoding/xml包正确识别并生成标准的命名空间声明。

内容的提问来源于stack exchange,提问作者Daniel Najatec

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 16:27:15