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

使用Golang etree添加外层XML时出现空标签<>,如何消除?

解决beevik/etree添加XML外层时出现空标签的问题

你遇到的问题是因为错误地将原XML的文档节点直接添加到外层soap:Envelope中,etree的文档节点是无名称的容器,直接添加会生成多余的空标签<></>。

修正方案

解析原XML后,提取它的根元素节点,再将这个根元素添加到外层结构中,而非直接添加文档节点。

修正后的代码

package main

import (
	"fmt"
	"github.com/beevik/etree"
)

func main() {
	// 动态原XML内容(可替换为<Bar/>等任意合法单根XML)
	rawXML := "<Foo></Foo>"

	// 解析原XML并提取根元素
	srcDoc := etree.NewDocument()
	if err := srcDoc.ReadFromString(rawXML); err != nil {
		panic(err)
	}
	srcRoot := srcDoc.Root()
	if srcRoot == nil {
		panic("原XML无有效根节点")
	}

	// 构建外层SOAP结构
	envelope := etree.NewElement("soap:Envelope")
	envelope.CreateElement("soap:Header")
	envelope.CreateElement("soap:Body")
	// 将原根元素添加到Envelope下
	envelope.AddChild(srcRoot)

	// 生成格式化后的XML输出
	doc := etree.NewDocument()
	doc.SetRoot(envelope)
	doc.Indent(2)
	output, err := doc.WriteToString()
	if err != nil {
		panic(err)
	}
	fmt.Println(output)
}

输出结果

soap:Envelope
soap:Header/
soap:Body/

return (<Foo/>)

</soap:Envelope>

额外说明

如果原XML存在多根节点(不符合标准XML规范),可以先创建一个临时容器元素包裹所有根节点,再将临时容器添加到Envelope中:

// 处理多根节点的情况
tempContainer := etree.NewElement("Temp")
for _, elem := range srcDoc.RootElements() {
	tempContainer.AddChild(elem)
}
envelope.AddChild(tempContainer)

内容的提问来源于stack exchange,提问作者David Async

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 08:30:47