跳到主内容
UniKit

XML 转 Go struct

粘贴 XML 示例,按属性、子元素与文本生成带 xml tag 的 Go 结构体:支持导出字段名、,attr、,chardata、重复元素切片与 omitempty,非法 XML 给出行列位置。

浏览器本地运行所有计算都在你的浏览器里完成,数据不会离开本机。

生成选项

关闭后字段小写,包外不可见

数字、浮点与 true/false 会按内容推断类型,其余按 string 处理;文本只在元素同时有属性或子元素时生成 ,chardata 字段

这个工具能做什么

  • 对接 SOAP 或第三方 XML 接口时,先贴一段真实响应,直接得到可以直接 Unmarshal 的 Go struct,省掉手写 struct tag 的功夫。
  • 整理接口文档:把示例报文变成带 xml tag 的结构体定义,字段名、类型和属性标记都自动补上。
  • 处理重复元素时自动生成切片([]string),数字、浮点与 true/false 按内容推断类型,不用逐个字段判断。
  • 需要控制生成结果时,可以关掉字段导出、关掉 ,attr / ,chardata、加 omitempty 或改包名,方便直接放进现有项目。

示例

输入

<user id="42"><name>Ada</name><tag>go</tag><tag>xml</tag></user>

输出

package main

import "encoding/xml"

type User struct {
	XMLName xml.Name `xml:"user"`
	ID int `xml:"id,attr"`
	Name string `xml:"name"`
	Tag []string `xml:"tag"`
}

默认选项(包名 main、字段导出、生成 ,attr、重复元素成切片)的输出。根结构体会多一个 XMLName 字段,属性值 "42" 被推断成 int。

常见问题

生成的字段类型是怎么推断的?

按元素文本内容判断:全是整数(可带负号)是 int,形如 1.5 的是 float64,全是 true/false 是 bool,其余(含空值与混合值)都是 string。推断只看样例,真实数据里混入其它格式时 Unmarshal 会失败,必要时手动改成 string。

嵌套元素什么时候会生成新 struct?

子元素自己还有子元素、或者带属性(且开着 ,attr 选项)时,会为它生成一个独立的 struct,父结构体里的字段类型就是那个 struct。纯文本的重复子元素则合并成切片,例如 <tag>go</tag><tag>xml</tag> → Tag []string。

XML 里有文本又有子元素怎么办?

元素同时有属性和直接文本(例如 <p>Hello <b>world</b></p> 这种混合内容)时,会额外生成一个 Value 字段并标上 `xml:",chardata"`,用来接住直接文本。只有文本、没有属性也没有子元素的元素不会生成 chardata 字段。

命名规则是什么?

元素名与属性名会转成大驼峰(user_id → UserID,id → ID,url → URL 这类常见缩写会整体大写),中划线、下划线、点号都会当作分隔符。以数字开头会自动加下划线前缀。关掉「字段名导出」后字段名小写,包外不可见。

XML 写错了会怎样?

会抛带行列的错误,例如 invalid-xml:line 3 column 5:mismatched-tag,界面会翻成「第 3 行第 5 列:结束标签与开始标签不匹配」。注释、CDATA、处理指令与 DOCTYPE 会被解析器跳过,不影响结构。所有处理都在浏览器本地完成。

关键词:xmlgogolangstructtagunmarshalxml tag代码生成结构体转换

同类工具