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
相关产品推荐
相关产品推荐

