首页 > 后端开发 > Golang > 如何在Go中不使用XPath高效遍历XML数据?

如何在Go中不使用XPath高效遍历XML数据?

Barbara Streisand
发布: 2024-11-29 06:57:10
原创
529 人浏览过

How Can I Efficiently Traverse XML Data in Go Without Using XPath?

Go 中的 XML 数据遍历

问题:

XML 数据通常会带来挑战无需事先了解 XPath 即可访问特定元素。 xml.Unmarshal方法在这方面有局限性,需要用户指定确切的路径来获取数据。

解决方案:

要灵活地遍历XML数据,我们可以利用递归数据结构和简单的步行函数。

递归数据结构:

type Node struct {
    XMLName xml.Name
    Content []byte `xml:",innerxml"`
    Nodes   []Node `xml:",any"`
}
登录后复制

在此结构中,每个 Node 代表 XML 文档中的一个元素,包含其名称、内部 XML 内容(对于非嵌套元素)和子节点切片。

步行函数:

func walk(nodes []Node, f func(Node) bool) {
    for _, n := range nodes {
        if f(n) {
            walk(n.Nodes, f)
        }
    }
}
登录后复制

递归步行函数遍历节点树,为每个遇到的节点调用提供的函数 f。

用法:

遍历 XML 文档并相应地处理其元素:

  1. 将 XML 数据解组到 Node 结构中。
  2. 定义过滤函数 f,指定处理节点的条件(例如,基于元素名称或内容)。
  3. 以根节点和过滤函数作为参数调用 walk 函数。

示例:

以下代码遍历问题中的 XML 文档,打印其中的元素名称顺序:

content := Node{}
if err := xml.Unmarshal([]byte(rawXML), &content); err != nil {
    // Handle error
}

walk(content.Nodes, func(n Node) bool {
    fmt.Println(n.XMLName.Local)
    return true
})
登录后复制

输出:

content
p
animal
p
dog
p
birds
p
p
animal
p
登录后复制

以上是如何在Go中不使用XPath高效遍历XML数据?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板