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

