登录
首页 >  Golang >  Go问答

在 Golang 中使用非结构化方法操作 XML 文档

来源:stackoverflow

时间:2024-02-23 11:39:27 405浏览 收藏

积累知识,胜过积蓄金银!毕竟在Golang开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《在 Golang 中使用非结构化方法操作 XML 文档》,就带大家讲解一下知识点,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

我使用 Golang 作为 API 网关,我们需要从文档中删除某些 XML 元素。

我们无法使用结构/编组,因为 XML 结构庞大且可变 - 但我们始终需要根据名称/路径删除一些 XML 元素

我尝试“遍历”XML 文档并根据名称“跳过”某些元素。

我的示例在这里,但我收到错误:https://go.dev/play/p/LJtlYXWvJ_d

panic: xml: 结束标记 与开始标记

我一定做错了什么,我能找到的大多数例子都使用结构来做到这一点。


正确答案


如果你看看这个输出:

end tag of  age  parent name is  age

它提供了一个很好的线索。然后看这里:

case xml.endelement:
            println("end tag of ", t.name.local, " parent name is ", parent.name.local)
            if skip && t.name == parent.name {
                skip = false
                parent = xml.startelement{}
            }
            if !skip {
                println("encoding end element ", t.name.local, " buffer is ", buf.string())
                err := encoder.encodetoken(token)
                if err != nil {
                    panic(err)
                }
            }
            encoder.flush()

从输出中我们可以看到 skip && t.name ==parent.name 将为 true。我们将 skip 切换为 false 并重置 parent。然后我们继续检查 if !skip 。我们只是将 skip 设置为 false,因此我们尝试对令牌进行编码。但我们应该跳过该标记!

解决方法很简单:只需在该情况下添加 break 即可。

if skip && t.name == parent.name {

                skip = false
                parent = xml.startelement{}
                break
            }

给出(调试输出已删除):

		
			
				John
				
			
			
				Jane
				
			
		

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《在 Golang 中使用非结构化方法操作 XML 文档》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>