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

如何在Golang中高效遍历XML数据?

DDD
发布: 2024-11-29 12:23:13
原创
843 人浏览过

How to Efficiently Traverse XML Data in Golang?

在 Golang 中遍历 XML 数据

要在 Golang 中遍历 XML 数据,可以通过构造递归结构体并使用 walk 函数来利用普通编码/xml 方法.

结构定义和行走函数

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

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

示例用法

考虑以下 XML:

<content>
    <p>this is content area</p>
    <animal>
        <p>This id dog</p>
        <dog>
           <p>tommy</p>
        </dog>
    </animal>
    <birds>
        <p>this is birds</p>
        <p>this is birds</p>
    </birds>
    <animal>
        <p>this is animals</p>
    </animal>
</content>
登录后复制

遍历 XML 并处理每个节点及其子节点:

  1. 将 XML 解组为结构体:

    var content Node
    if err := xml.Unmarshal(xmlData, &content); err != nil {
     // handle error
    }
    登录后复制
  2. 使用 walk 函数遍历结构体:

    walk(content.Nodes, func(n Node) bool {
     // Process the node or traverse its child nodes here
     fmt.Printf("Node: %s\n", n.XMLName.Local)
     return true
    })
    登录后复制

带属性的增强版本

对于有属性的节点,这里有一个增强的version:

type Node struct {
    XMLName xml.Name
    Attrs   []xml.Attr `xml:",any,attr"`
    Content []byte     `xml:",innerxml"`
    Nodes   []Node     `xml:",any"`
}

func (n *Node) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
    n.Attrs = start.Attr
    type node Node

    return d.DecodeElement((*node)(n), &start)
}
登录后复制

这允许访问节点处理逻辑中的属性。

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

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