如何使用Golang从XML文档中删除/删除/修改XML元素而不使用结构体

qcbq4gxm  于 2023-04-18  发布在  Go
关注(0)|答案(1)|浏览(297)

我正在使用Golang作为API网关,我们需要从文档中删除某些XML元素。
我们不能使用结构/编组,因为XML结构非常庞大且多变-但我们始终需要根据名称/路径删除一些XML元素
我尝试过“遍历”XML文档,并根据名称“跳过”某些元素。
我的例子在这里,但我得到错误:https://go.dev/play/p/LJtlYXWvJ_d
panic: xml: end tag </age> does not match start tag <person>
我一定是做错了什么,我能找到的大多数例子都是用结构来做的。

kgsdhlau

kgsdhlau1#

如果你看一下这个输出:

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,因此我们尝试对令牌进行编码。但我们应该跳过该令牌!
The fix is simple:只需在case条件中添加一个break

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

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

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

&#x9;&#x9;<people>
&#x9;&#x9;&#x9;<person>
&#x9;&#x9;&#x9;&#x9;<name>John</name>
&#x9;&#x9;&#x9;&#x9;
&#x9;&#x9;&#x9;</person>
&#x9;&#x9;&#x9;<person>
&#x9;&#x9;&#x9;&#x9;<name>Jane</name>
&#x9;&#x9;&#x9;&#x9;
&#x9;&#x9;&#x9;</person>
&#x9;&#x9;</people>

相关问题