惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google Online Security Blog
Google Online Security Blog
S
Security @ Cisco Blogs
Recent Commits to openclaw:main
Recent Commits to openclaw:main
人人都是产品经理
人人都是产品经理
The Hacker News
The Hacker News
W
WeLiveSecurity
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Cloudflare Blog
博客园 - 司徒正美
雷峰网
雷峰网
L
LINUX DO - 最新话题
博客园 - 叶小钗
云风的 BLOG
云风的 BLOG
The Last Watchdog
The Last Watchdog
V2EX - 技术
V2EX - 技术
S
Security Affairs
有赞技术团队
有赞技术团队
月光博客
月光博客
T
Threatpost
T
Tor Project blog
O
OpenAI News
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
V
V2EX
Know Your Adversary
Know Your Adversary
Project Zero
Project Zero
博客园 - 三生石上(FineUI控件)
D
Docker
AWS News Blog
AWS News Blog
AI
AI
P
Proofpoint News Feed
K
Kaspersky official blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
D
Darknet – Hacking Tools, Hacker News & Cyber Security
www.infosecurity-magazine.com
www.infosecurity-magazine.com
S
Securelist
F
Fortinet All Blogs
F
Full Disclosure
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
量子位
Hacker News - Newest:
Hacker News - Newest: "LLM"
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
P
Palo Alto Networks Blog
Cyberwarzone
Cyberwarzone
Cisco Talos Blog
Cisco Talos Blog
美团技术团队
N
News | PayPal Newsroom
T
The Blog of Author Tim Ferriss
MyScale Blog
MyScale Blog

希仁之拥

领克900半年使用体验 | 希仁之拥的博客 Ubuntu 26.04 Desktop使用体验 | 希仁之拥的博客 【转载】谈谈不受欢迎的博客技术特征 | 希仁之拥的博客 【转载】ClaudeCode 你想知道的所有秘密,源码深度研究报告 | 希仁之拥的博客 2025年年终总结 | 希仁之拥的博客 集成和使用Openclaw后的思考 | 希仁之拥的博客 我买了领克900 | 希仁之拥的博客 服务器性能优化之io拷贝 | 希仁之拥的博客 Go-Sail导航站上线啦 | 希仁之拥的博客 今年国庆的一些感受 [2025] | 希仁之拥的博客 在Deepin 25上配置forticlient | 希仁之拥的博客 分享一些酷酷的站点 [20250908] | 希仁之拥的博客 Go-Sail发布v3.0.6版本了 | 希仁之拥的博客 我对V2EX发布$V2EX讨论的一些感受 | 希仁之拥的博客 如何让Stripe支持支付宝和微信支付 | 希仁之拥的博客 2025上半年里程碑 | 希仁之拥的博客 GitLab+Drone使用体验 | 希仁之拥的博客 四姑娘山之旅 | 希仁之拥的博客 近来帮同事做性能优化的过程回顾 | 希仁之拥的博客 聊聊接口的返回数据结构 | 希仁之拥的博客 由GORM的Updates语法糖 我把 Go-Sail 的文档站更新了 | 希仁之拥的博客 这就是我为什么讨厌拼多多 | 希仁之拥的博客 元旦快乐~ | 希仁之拥的博客 致敬还在写博客的我们 | 希仁之拥的博客 逐步的把图片资源迁移到星光图床上 | 希仁之拥的博客 帮弟弟配了一台mini主机 | 希仁之拥的博客 国庆的一些碎碎念 | 希仁之拥的博客 就这一刻而言,我觉得科技冷冰冰的。 | 希仁之拥的博客 如何使用acme.sh自动续签证书 | 希仁之拥的博客 Go-Sail的文档站点搭建好了 | 希仁之拥的博客 我的第一个谷歌浏览器插件发布成功啦! | 希仁之拥的博客 我开源了一个golang的web框架 | 希仁之拥的博客 流芳 | 希仁之拥的博客 第一次开发微信小程序 | 希仁之拥的博客 春节快乐 | 希仁之拥的博客 我把博客站点重写了 | 希仁之拥的博客 阆中古城 | 希仁之拥的博客 入了把Keydous NJ80 | 希仁之拥的博客 Mac上有用的知识 | 希仁之拥的博客 记一次服务器被攻击 | 希仁之拥的博客 Ubuntu server不停机扩容系统盘 | 希仁之拥的博客 端午安康 | 希仁之拥的博客 搭建hadoop伪分布式集群总结 | 希仁之拥的博客 在goa框架中,如何访问原始请求数据 | 希仁之拥的博客 postgresql相关操作笔记 | 希仁之拥的博客 【转载】解决deepin环境下wine QQ无法接收图片问题 | 希仁之拥的博客 杂项笔记 | 希仁之拥的博客 Mac如何修改通知横幅消失时间 | 希仁之拥的博客 Golang校验结构体是否实现了接口 | 希仁之拥的博客 关于deepin os的大半年使用体验 | 希仁之拥的博客 有态度的翻唱 | 希仁之拥的博客 【转载】Golang 在 Mac、Linux、Windows 下如何交叉编译 | 希仁之拥的博客 和幺幺一起成长的半年时光 | 希仁之拥的博客 Element UI中message消息提示实现原理 | 希仁之拥的博客 从predis组件开始了解如何与redis服务交互 | 希仁之拥的博客 【转载】 尤雨溪谈Vue.js :缔造自由与真我 | 希仁之拥的博客 【转载】百万 Go TCP 连接的思考: epoll方式减少资源占用 | 希仁之拥的博客 【分享】移除git中的commit历史(保留文件,仅移除提交历史信息) | 希仁之拥的博客 shell学习笔记 | 希仁之拥的博客 【分享】Ruby 之父松本行弘:程序员的乐趣、存在感与平衡 | 希仁之拥的博客 安利一下我用过的一些sublime text 3工具、插件及配置 | 希仁之拥的博客 PHP处理苹果内购数据验证 | 希仁之拥的博客 PHP获取XML所有节点名称 | 希仁之拥的博客 Sentinel::check() 在Laravel5.3版本之后总是返回false的解决方案 | 希仁之拥的博客 吃货的美食集,持续更新~ | 希仁之拥的博客 第二十一届成都汽车博览会 | 希仁之拥的博客 马云宣布1年后卸任集团董事局主席 由CEO张勇接任 | 希仁之拥的博客 nginx配置非443端口的https连接 | 希仁之拥的博客 PHP7 异常类型列表 | 希仁之拥的博客 【分享】《燃点》:不被嘲笑的愿望是不值得去实现的|一部属于创业者的电影 | 希仁之拥的博客 【分享】前端资源加载优先级[译] | 希仁之拥的博客 【小技巧】Laravel动态配置多个数据库连接 | 希仁之拥的博客 php使用ftp上传、下载文件 | 希仁之拥的博客 php使用mysqlnd扩展进行mysql异步并行查询 | 希仁之拥的博客 基于以太坊区块链,使用web3.js在geth服务器上执行合约方法以及事件监听 | 希仁之拥的博客 Smartisan OS | 希仁之拥的博客 母校 | 希仁之拥的博客 php后期静态绑定 | 希仁之拥的博客 [mysql优化]子查询与连接查询 | 希仁之拥的博客 PHP常见运行模式及原理 | 希仁之拥的博客 mysql用户与授权 | 希仁之拥的博客 如何在ubuntu14.04上安装composer | 希仁之拥的博客 关于mews/captcha for laravel存在method [validateCaptcha] doesn't exists解决方法 | 希仁之拥的博客
golang解析带命名空间的xml数据(带冒号的节点或属性名) | 希仁之拥的博客
希仁之拥 · 2020-12-07 · via 希仁之拥

XML数据结构

<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:zeebe="http://camunda.org/schema/zeebe/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Zeebe Modeler" exporterVersion="0.1.0">
  <bpmn:process id="order-process" isExecutable="true">
    <bpmn:startEvent id="order-placed" name="Order Placed">
      <bpmn:outgoing>SequenceFlow_18tqka5</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:endEvent id="order-delivered" name="Order Delivered">
      <bpmn:incoming>SequenceFlow_1qj94z0</bpmn:incoming>
    </bpmn:endEvent>
  </bpmn:process>
</bpmn:definitions>

解析(反序列化)

  • 定义结构体
type bp struct {
	XMLName xml.Name `xml:"http://www.omg.org/spec/BPMN/20100524/MODEL definitions"`
	// <!--attributes start-->
	BPMN            string `xml:"bpmn,attr"`
	BPMNDI          string `xml:"bpmndi,attr"`
	DI              string `xml:"di,attr"`
	DC              string `xml:"dc,attr"`
	Zeebe           string `xml:"zeebe,attr"`
	XSI             string `xml:"xsi,attr"`
	ID              string `xml:"id,attr"`
	TargetNamespace string `xml:"targetNamespace,attr"`
	Exporter        string `xml:"exporter,attr"`
	ExporterVersion string `xml:"exporterVersion,attr"`
	// <!--attributes end-->
	Process struct {
		// <!--attributes start-->
		ID           string `xml:"id,attr"`
		Name         string `xml:"name,attr"`
		IsExecutable bool   `xml:"isExecutable,attr"`
		// <!--attributes end-->
		StartEvent struct {
			// <!--attributes start-->
			ID   string `xml:"id,attr"`
			Name string `xml:"name,attr"`
			// <!--attributes end-->
			Outgoing string `xml:"http://www.omg.org/spec/BPMN/20100524/MODEL outgoing"`
		} `xml:"http://www.omg.org/spec/BPMN/20100524/MODEL startEvent"`
		EndEvent struct {
			// <!--attributes start-->
			ID   string `xml:"id,attr"`
			Name string `xml:"name,attr"`
			// <!--attributes end-->
			Incoming string `xml:"http://www.omg.org/spec/BPMN/20100524/MODEL incoming"`
		} `xml:"http://www.omg.org/spec/BPMN/20100524/MODEL endEvent"`
	} `xml:"http://www.omg.org/spec/BPMN/20100524/MODEL process"`
}
  • 解析
var target bp
err = xml.Unmarshal(bpmn, &target)
if err != nil {
	fmt.Println("parse xml file error: ", err)
}
fmt.Println("Print xml struct:")
fmt.Println(target, target.BPMNDI, target.ExporterVersion)
fmt.Println(target.Process.IsExecutable)
fmt.Println(target.Process.StartEvent.Outgoing)

序列化

值得注意的是,直接使用上面的bp结构体序列化为xml字符串会发现结果的结构与预期并不一致。golang playground

相关issue #9519

解决方案

解决方案是将序列化(Marshal)和反序列化(Unmarshal)的结构体分别定义。golang playground

  • 定义结构体(仅修改了部分)
type bpEn struct {
	XMLName xml.Name `xml:"bpmn:definitions"` // <----- 修改
	// <!--attributes start-->
	BPMN            string `xml:"xmlns:bpmn,attr"` // <---- 修改
	BPMNDI          string `xml:"bpmndi,attr"`
	DI              string `xml:"di,attr"`
	DC              string `xml:"dc,attr"`
	Zeebe           string `xml:"zeebe,attr"`
	XSI             string `xml:"xsi,attr"`
	ID              string `xml:"id,attr"`
	TargetNamespace string `xml:"targetNamespace,attr"`
	Exporter        string `xml:"exporter,attr"`
	ExporterVersion string `xml:"exporterVersion,attr"`
	// <!--attributes end-->
	Process struct {
		// <!--attributes start-->
		ID           string `xml:"id,attr"`
		Name         string `xml:"name,attr"`
		IsExecutable bool   `xml:"isExecutable,attr"`
		// <!--attributes end-->
		StartEvent struct {
			// <!--attributes start-->
			ID   string `xml:"id,attr"`
			Name string `xml:"name,attr"`
			// <!--attributes end-->
			Outgoing string `xml:"http://www.omg.org/spec/BPMN/20100524/MODEL outgoing"`
		} `xml:"http://www.omg.org/spec/BPMN/20100524/MODEL startEvent"`
		EndEvent struct {
			// <!--attributes start-->
			ID   string `xml:"id,attr"`
			Name string `xml:"name,attr"`
			// <!--attributes end-->
			Incoming string `xml:"http://www.omg.org/spec/BPMN/20100524/MODEL incoming"`
		} `xml:"http://www.omg.org/spec/BPMN/20100524/MODEL endEvent"`
	} `xml:"http://www.omg.org/spec/BPMN/20100524/MODEL process"`
}
  • 序列化
	bpmn := []byte(`<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:zeebe="http://camunda.org/schema/zeebe/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Zeebe Modeler" exporterVersion="0.1.0">
  <bpmn:process id="order-process" isExecutable="true">
    <bpmn:startEvent id="order-placed" name="Order Placed">
      <bpmn:outgoing>SequenceFlow_18tqka5</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:endEvent id="order-delivered" name="Order Delivered">
      <bpmn:incoming>SequenceFlow_1qj94z0</bpmn:incoming>
    </bpmn:endEvent>
  </bpmn:process>
</bpmn:definitions>`)

	var en bpEn
	en.Process.IsExecutable = false
	en.Process.ID = "identity"
	en.Process.Name = "Hello Someone"
	en.Process.StartEvent.Outgoing = "xyz"
	enSt, err := xml.MarshalIndent(&en, "", "	")
	fmt.Println("原本结构:\n", string(bpmn), "\n", "序列化后结构:\n", string(enSt), err)
	return

参考文章:

https://blog.csdn.net/qq_24210767/article/details/102829205

https://studygolang.com/articles/5328

转载请注明原文地址:https://blog.keepchen.com/a/golang-parse-xml-with-namespace-prefix.html