Golang Go语言中请教一个 XML 序列化问题

发布于 1周前 作者 sinazl 来自 Go语言

我要生成如下 xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<svc_init ver="2.0.0">
	<sms ver="2.0.0">
		<client>
			<id>id</id>
			<pwd>pwd</pwd>
			<serviceid>serviceid</serviceid>
		</client>
		<sms_info>
			<phone>13013001300</phone>
			<content>测试</content>
		</sms_info>
	</sms>
</svc_init>

代码为

package main

import ( “encoding/xml” “fmt” “os” )

type Client struct { Id string xml:"client&gt;id" Pwd string xml:"client&gt;pwd" Serviceid string xml:"client&gt;serviceid" }

type Sms_info struct { Phone string xml:"sms_info&gt;phone" Content string xml:"sms_info&gt;content" }

type Sms struct { XMLName xml.Name xml:"sms" Ver string xml:"ver,attr" Client Sms_info }

type Svc_init struct { XMLName xml.Name xml:"svc_init" Ver string xml:"ver,attr" Sms }

func main() { id := “id” pwd := “pwd” serviceid := “serviceid”

client := Client{Id: id, Pwd: pwd, Serviceid: serviceid}
sms_info := Sms_info{Phone: "13013001300", Content: "测试"}

sms := Sms{Ver: "2.0.0", Client: client, Sms_info: sms_info}

v := Svc_init{Ver: "2.0.0", Sms: sms}

fmt.Println(v)
output, _ := xml.MarshalIndent(v, "  ", "    ")

os.Stdout.Write(output)

}

运行后生成

<svc_init ver="2.0.0">
	<client>
		<id>id</id>
		<pwd>pwd</pwd>
		<serviceid>serviceid</serviceid>
	</client>
	<sms_info>
		<phone>13013001300</phone>
		<content>测试</content>
	</sms_info>
</svc_init>

可以看到结果的 sms 结构丢失了 但是我直接打印 v 值

{{ } 2.0.0 {{ } 2.0.0 {id pwd serviceid} {13013001300 测试}}}

可以看到 sms 结构还在 请问为什么会这样,然后如何修复呢,感谢。


Golang Go语言中请教一个 XML 序列化问题

更多关于Golang Go语言中请教一个 XML 序列化问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

没用过 Go 操作 xml ,但我看你的 Client 、Sms_info 是内嵌的,考虑一下使用 https://www.onlinetool.io/xmltogo/ 生成的结构?

另外打印的时候可以用 fmt.Printf("%+v", v),这样有字段名,好理解一点

更多关于Golang Go语言中请教一个 XML 序列化问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


结构里 代码写写全,IDE 没报错?

感谢,通过页面生成的结构成功了

go<br>package main<br><br>import (<br> "encoding/xml"<br> "os"<br>)<br><br>var data = `&lt;svc_init ver="2.0.0"&gt;<br>&lt;sms ver="2.0.0"&gt;<br> &lt;client&gt;<br> &lt;id&gt;id&lt;/id&gt;<br> &lt;pwd&gt;pwd&lt;/pwd&gt;<br> &lt;serviceid&gt;serviceid&lt;/serviceid&gt;<br> &lt;/client&gt;<br> &lt;sms_info&gt;<br> &lt;phone&gt;13013001300&lt;/phone&gt;<br> &lt;content&gt;测试&lt;/content&gt;<br> &lt;/sms_info&gt;<br>&lt;/sms&gt;<br>&lt;/svc_init&gt;`<br><br>type Client struct {<br> Id string `xml:"client&gt;id"`<br> Pwd string `xml:"client&gt;pwd"`<br> Serviceid string `xml:"client&gt;serviceid"`<br>}<br><br>type Sms_info struct {<br> Phone string `xml:"sms_info&gt;phone"`<br> Content string `xml:"sms_info&gt;content"`<br>}<br><br>type Sms struct {<br> Ver string `xml:"ver,attr"`<br> Client<br> Sms_info<br>}<br><br>type Svc_init struct {<br> XMLName <a target="_blank" href="http://xml.Name" rel="nofollow noopener">xml.Name</a> `xml:"svc_init"`<br> Ver string `xml:"ver,attr"`<br> Sms Sms `xml:"sms"`<br>}<br><br>func main() {<br> id := "id"<br> pwd := "pwd"<br> serviceid := "serviceid"<br><br> client := Client{Id: id, Pwd: pwd, Serviceid: serviceid}<br> sms_info := Sms_info{Phone: "13013001300", Content: "测试"}<br><br> sms := Sms{Ver: "2.0.0", Client: client, Sms_info: sms_info}<br><br> v := Svc_init{Ver: "2.0.0", Sms: sms}<br><br> output, _ := xml.MarshalIndent(v, " ", " ")<br><br> os.Stdout.Write(output)<br>}<br>
给 Sms 添加了一个 xml:"sms" 就好了
xml<br>&lt;svc_init ver="2.0.0"&gt;<br> &lt;sms ver="2.0.0"&gt;<br> &lt;client&gt;<br> &lt;id&gt;id&lt;/id&gt;<br> &lt;pwd&gt;pwd&lt;/pwd&gt;<br> &lt;serviceid&gt;serviceid&lt;/serviceid&gt;<br> &lt;/client&gt;<br> &lt;sms_info&gt;<br> &lt;phone&gt;13013001300&lt;/phone&gt;<br> &lt;content&gt;测试&lt;/content&gt;<br> &lt;/sms_info&gt;<br> &lt;/sms&gt;<br> &lt;/svc_init&gt;<br>

在Go语言中处理XML序列化时,通常会用到标准库中的encoding/xml包。这个包提供了一些基础的工具和结构体标签来帮助你将Go的结构体序列化为XML格式,或者从XML格式反序列化为Go结构体。

如果你遇到XML序列化的问题,这里有几个关键点需要注意:

  1. 结构体标签:确保你的结构体字段使用了正确的XML标签。例如,xml:"TagName"可以指定字段在XML中的名称。如果字段是匿名字段,它将直接包含该字段的结构体的XML表示。

  2. 忽略字段:使用-标签可以忽略某些字段,例如xml:"-"

  3. 嵌套结构:通过嵌套结构体可以构建复杂的XML结构。

  4. 指针与值:XML序列化时,指针字段只有在非nil时才会被序列化,而值字段总是会被尝试序列化。

  5. 特性(Attributes):使用结构体标签的,attr后缀可以将字段作为XML元素的属性而不是子元素。

  6. 序列化与反序列化:使用Marshal函数将结构体序列化为XML,使用Unmarshal函数从XML反序列化为结构体。

如果你遇到了具体的错误或问题,可以详细描述一下错误信息和相关代码,这样我可以提供更具体的帮助。例如,你可以分享你的结构体定义、期望的XML输出以及遇到的错误信息。这将有助于快速定位问题所在。

回到顶部